summaryrefslogtreecommitdiff
path: root/qa/src/chkoptfetch.c
diff options
context:
space:
mode:
Diffstat (limited to 'qa/src/chkoptfetch.c')
-rw-r--r--qa/src/chkoptfetch.c285
1 files changed, 285 insertions, 0 deletions
diff --git a/qa/src/chkoptfetch.c b/qa/src/chkoptfetch.c
new file mode 100644
index 0000000..7fde1b0
--- /dev/null
+++ b/qa/src/chkoptfetch.c
@@ -0,0 +1,285 @@
+/*
+ * Copyright (c) 1997-2002 Silicon Graphics, Inc. All Rights Reserved.
+ */
+
+#include <pcp/pmapi.h>
+#include <pcp/impl.h>
+
+static fetchctl_t *root;
+
+static optreq_t *req;
+static pmDesc *desc;
+static int *cost;
+static int *nfetch;
+static pmUnits nounits;
+
+static void
+setup(int i, int pmid_d, int pmid_i, int indom_d, int indom_s, int loinst, int hiinst)
+{
+ int j;
+ int numinst;
+ static int pmid = 0;
+ static int indom = 0;
+ static __pmID_int *pmidp = (__pmID_int *)&pmid;
+ static __pmInDom_int *indomp = (__pmInDom_int *)&indom;
+
+ pmidp->flag = 0;
+ pmidp->domain = pmid_d;
+ pmidp->cluster = 0;
+ pmidp->item = pmid_i;
+ indomp->flag = 0;
+ indomp->domain = indom_d;
+ indomp->serial = indom_s;
+
+ desc = (pmDesc *)realloc(desc, (i+1) * sizeof(desc[0]));
+ if (desc == (pmDesc *)0) {
+ __pmNoMem("setup.desc", (i+1) * sizeof(desc[0]), PM_FATAL_ERR);
+ }
+ desc[i].pmid = pmid;
+ desc[i].type = PM_TYPE_32;
+ desc[i].indom = indom;
+ desc[i].sem = PM_SEM_DISCRETE;
+ desc[i].units = nounits;
+
+ req = (optreq_t *)realloc(req, (i+1) * sizeof(req[0]));
+ if (req == (optreq_t *)0) {
+ __pmNoMem("setup.req", (i+1) * sizeof(req[0]), PM_FATAL_ERR);
+ }
+ if (loinst != -1) {
+ req[i].r_numinst = numinst = (hiinst - loinst + 1);
+ req[i].r_instlist = (int *)malloc(numinst * sizeof(req[i].r_instlist[0]));
+ if (req[i].r_instlist == (int *)0) {
+ __pmNoMem("setup.instlist", numinst * sizeof(req[i].r_instlist[0]), PM_FATAL_ERR);
+ }
+ for (j = 0; j < numinst; j++)
+ req[i].r_instlist[j] = loinst + j;
+ }
+ else {
+ /* use loinst == -1 to flag "all" instances here */
+ req[i].r_numinst = 0;
+ req[i].r_instlist = (int *)0;
+ }
+
+ cost = (int *)realloc(cost, (i+1) * sizeof(cost[0]));
+ if (cost == (int *)0) {
+ __pmNoMem("setup.cost", (i+1) * sizeof(cost[0]), PM_FATAL_ERR);
+ }
+ nfetch = (int *)realloc(nfetch, (i+1) * sizeof(nfetch[0]));
+ if (nfetch == (int *)0) {
+ __pmNoMem("setup.nfetch", (i+1) * sizeof(nfetch[0]), PM_FATAL_ERR);
+ }
+}
+
+int
+main(int argc, char **argv)
+{
+ int c;
+ int errflag = 0;
+ int sts;
+#ifdef PCP_DEBUG
+ static char *debug = "[-D N] ";
+#else
+ static char *debug = "";
+#endif
+ static char *usage = "";
+ int i;
+ int numreq;
+ int numfetch;
+ int totcost;
+ int dump;
+ int numfail;
+ optcost_t ocp = { 4, 1, 15, 10, 2, 0 }; /* my costs */
+ fetchctl_t *fp;
+
+ __pmSetProgname(pmProgname);
+
+ while ((c = getopt(argc, argv, "D:")) != EOF) {
+ switch (c) {
+
+#ifdef PCP_DEBUG
+
+ case 'D': /* debug flag */
+ sts = __pmParseDebug(optarg);
+ if (sts < 0) {
+ fprintf(stderr, "%s: unrecognized debug flag specification (%s)\n",
+ pmProgname, optarg);
+ errflag++;
+ }
+ else
+ pmDebug |= sts;
+ break;
+#endif
+
+ case '?':
+ default:
+ errflag++;
+ break;
+ }
+ }
+
+ if (errflag) {
+ fprintf(stderr, "Usage: %s %s%s\n", pmProgname, debug, usage);
+ exit(1);
+ }
+
+ __pmOptFetchPutParams(&ocp);
+ __pmOptFetchGetParams(&ocp);
+ fprintf(stderr, "optFetch Cost Parameters:\n pmid=%d indom=%d fetch=%d indomsize=%d, xtrainst=%d scope=%d\n",
+ ocp.c_pmid, ocp.c_indom, ocp.c_fetch,
+ ocp.c_indomsize, ocp.c_xtrainst, ocp.c_scope);
+
+ i = 0;
+ setup(i, 3, 4, 3, 7, 1, 3);
+ nfetch[i] = 1;
+ cost[i] = ocp.c_fetch + ocp.c_pmid + ocp.c_indom;
+ setup(++i, 3, 4, 3, 7, -1, -1);
+ nfetch[i] = 1;
+ cost[i] = cost[i-1] - ocp.c_fetch;
+ setup(++i, 3, 5, 3, 7, 1, 5);
+ nfetch[i] = 1;
+ cost[i] = ocp.c_pmid + ocp.c_indom + (ocp.c_indomsize - 5) * ocp.c_xtrainst;
+ setup(++i, 3, 6, 3, 7, 1, 8);
+ nfetch[i] = 1;
+ cost[i] = cost[i-1] + (ocp.c_indomsize - 8) * ocp.c_xtrainst;
+ setup(++i, 3, 7, 3, 7, 11, 11);
+ nfetch[i] = 1;
+ cost[i] = cost[i-1] + (ocp.c_indomsize - 1) * ocp.c_xtrainst;
+ setup(++i, 4, 4, 3, 7, -1, -1);
+ nfetch[i] = 1;
+ cost[i] = cost[i-1] + ocp.c_pmid;
+ setup(++i, 5, 4, 3, 7, 1, 5);
+ nfetch[i] = 1;
+ cost[i] = cost[i-1] + ocp.c_pmid + (ocp.c_indomsize - 5) * ocp.c_xtrainst;
+ setup(++i, 6, 4, 3, 7, 1, 8);
+ nfetch[i] = 1;
+ cost[i] = cost[i-1] + ocp.c_pmid + (ocp.c_indomsize - 8) * ocp.c_xtrainst;
+ setup(++i, 7, 4, 3, 7, 11, 11);
+ nfetch[i] = 2;
+ cost[i] = cost[i-1] + ocp.c_fetch + ocp.c_pmid + ocp.c_indom;
+ setup(++i, 7, 4, 3, 7, 10, 12);
+ nfetch[i] = 2;
+ cost[i] = cost[i-1] - ocp.c_fetch;
+ setup(++i, 7, 4, 3, 7, 9, 13);
+ nfetch[i] = 2;
+ cost[i] = cost[i-1];
+
+ numreq = ++i;
+
+ numfail = 0;
+ for (i = 0; i < numreq; i++) {
+ req[i].r_desc = &desc[i];
+ __pmOptFetchAdd(&root, &req[i]);
+#ifdef PCP_DEBUG
+ if (pmDebug & DBG_TRACE_OPTFETCH) {
+ fprintf(stdout, "\nAdd request %d @ " PRINTF_P_PFX "%p\n", i, &req[i]);
+ __pmOptFetchDump(stdout, root);
+ }
+#endif
+ numfetch = 0;
+ totcost = 0;
+ for (fp = root; fp != (fetchctl_t *)0; fp = fp->f_next) {
+ fp->f_state &= (~ OPT_STATE_UMASK);
+ totcost += fp->f_cost;
+ numfetch++;
+ }
+ dump = 0;
+ if (numfetch != nfetch[i]) {
+ printf("After adding request %d, no. fetches %d, expected %d\n",
+ i, numfetch, nfetch[i]);
+ dump = 1;
+ }
+ if (totcost != cost[i]) {
+ printf("After adding request %d, total cost %d, expected %d\n",
+ i, totcost, cost[i]);
+ dump = 1;
+ }
+ if (dump == 1) {
+ numfail++;
+ __pmOptFetchDump(stdout, root);
+ }
+ }
+
+ printf("Passed %d of %d addition tests\n", numreq - numfail, numreq);
+
+ numfail = 0;
+ for (i = numreq-1; i >= 0; i--) {
+ __pmOptFetchDel(&root, &req[i]);
+#ifdef PCP_DEBUG
+ if (pmDebug & DBG_TRACE_OPTFETCH) {
+ fprintf(stdout, "\nDelete request %d @ " PRINTF_P_PFX "%p\n", i, &req[i]);
+ __pmOptFetchDump(stdout, root);
+ }
+#endif
+ if (i == 0)
+ continue;
+ numfetch = 0;
+ totcost = 0;
+ for (fp = root; fp != (fetchctl_t *)0; fp = fp->f_next) {
+ fp->f_state &= (~ OPT_STATE_UMASK);
+ totcost += fp->f_cost;
+ numfetch++;
+ }
+ /* handle special costs when we added another fetch to the group */
+ if (i == 1)
+ totcost += ocp.c_fetch;
+ else if (nfetch[i-1] != nfetch[i-2])
+ totcost += ocp.c_fetch * (nfetch[i-1] - nfetch[i-2]);
+
+ dump = 0;
+ if (numfetch != nfetch[i-1]) {
+ printf("After deleting data set %d, no. fetches %d, expected %d\n",
+ i, numfetch, nfetch[i-1]);
+ dump = 1;
+ }
+ if (totcost != cost[i-1]) {
+ printf("After deleting request %d, total cost %d, expected %d\n",
+ i, totcost, cost[i-1]);
+ dump = 1;
+ }
+ if (dump == 1) {
+ numfail++;
+ __pmOptFetchDump(stdout, root);
+ }
+ }
+ if (root != (fetchctl_t *)0) {
+ printf("Botch: expected no fetch lists after all requests deleted, got ...\n");
+ __pmOptFetchDump(stdout, root);
+ root = (fetchctl_t *)0;
+ numfail++;
+ }
+
+ printf("Passed %d of %d deletion tests\n", numreq - numfail, numreq);
+
+ /* add them all back again */
+ for (i = 0; i < numreq; i++) {
+ req[i].r_desc = &desc[i];
+ __pmOptFetchAdd(&root, &req[i]);
+ }
+ numfetch = 0;
+ totcost = 0;
+ for (fp = root; fp != (fetchctl_t *)0; fp = fp->f_next) {
+ totcost += fp->f_cost;
+ numfetch++;
+ }
+ printf("Before re-arrangement no. fetches %d, total cost %d\n", numfetch, totcost);
+
+ /* and re-arrange, a few times */
+ for (i = 0; i < 10; i++) {
+ __pmOptFetchRedo(&root);
+#ifdef PCP_DEBUG
+ if (pmDebug & DBG_TRACE_OPTFETCH) {
+ fprintf(stdout, "\nNow try a redo ...\n");
+ __pmOptFetchDump(stdout, root);
+ }
+#endif
+ numfetch = 0;
+ totcost = 0;
+ for (fp = root; fp != (fetchctl_t *)0; fp = fp->f_next) {
+ totcost += fp->f_cost;
+ numfetch++;
+ }
+ printf("After re-arrangement no. fetches %d, total cost %d\n", numfetch, totcost);
+ }
+
+ exit(0);
+}