qa: update 660 to generate index.html, fixing pcp-testsuite runs
[pcp.git] / qa / src / interp2.c
blob1dad42993977a1472549d86cd1caaf8985904781
1 /*
2 * Copyright (c) 1997-2001 Silicon Graphics, Inc. All Rights Reserved.
3 */
5 /*
6 * interp2 - random offset PM_MODE_INTERP exercises
7 */
9 #include <pcp/pmapi.h>
10 #include <pcp/impl.h>
12 static void
13 mung(struct timeval *start, struct timeval *end,
14 int pct, struct timeval *mid)
16 __int64_t sec, usec;
17 sec = (50 + pct * (__int64_t)end->tv_sec + (100 - pct) * (__int64_t)start->tv_sec) / 100;
18 usec = (50 + pct * (__int64_t)end->tv_usec + (100 - pct) * (__int64_t)start->tv_usec) / 100;
19 while (usec > 1000000) {
20 usec -= 1000000;
21 sec++;
23 while (usec < 0) {
24 usec += 1000000;
25 sec--;
27 mid->tv_sec = sec;
28 mid->tv_usec = usec;
31 static void
32 printstamp(struct timeval *tp)
34 static struct tm *tmp;
36 tmp = localtime(&tp->tv_sec);
37 printf("%02d:%02d:%02d.%03d", tmp->tm_hour, tmp->tm_min, tmp->tm_sec, (int)(tp->tv_usec/1000));
40 int
41 main(int argc, char **argv)
43 int c;
44 int sts;
45 int errflag = 0;
46 int ahtype = 0;
47 char *host = NULL; /* pander to gcc */
48 pmLogLabel label; /* get hostname for archives */
49 char *namespace = PM_NS_DEFAULT;
50 pmResult *result;
51 struct timeval tend;
52 struct timeval twant;
53 int msec;
54 int forw;
55 int back;
56 int pct;
57 int numpmid = 3;
58 pmID pmid[3];
59 char *name[] = { "sample.seconds", "sample.drift", "sample.milliseconds" };
61 __pmSetProgname(argv[0]);
63 while ((c = getopt(argc, argv, "a:D:n:?")) != EOF) {
64 switch (c) {
66 case 'a': /* archive name */
67 if (ahtype != 0) {
68 fprintf(stderr, "%s: at most one of -a and/or -h allowed\n", pmProgname);
69 errflag++;
71 ahtype = PM_CONTEXT_ARCHIVE;
72 host = optarg;
73 break;
75 case 'D': /* debug flag */
76 sts = __pmParseDebug(optarg);
77 if (sts < 0) {
78 fprintf(stderr, "%s: unrecognized debug flag specification (%s)\n",
79 pmProgname, optarg);
80 errflag++;
82 else
83 pmDebug |= sts;
84 break;
87 case 'n': /* alternative name space file */
88 namespace = optarg;
89 break;
91 case '?':
92 default:
93 errflag++;
94 break;
98 if (errflag) {
99 fprintf(stderr,
100 "Usage: %s options ...\n\
102 Options\n\
103 -a archive metrics source is an archive log\n\
104 -D debug standard PCP debug flag\n\
105 -n namespace use an alternative PMNS\n",
106 pmProgname);
107 exit(1);
110 if (namespace != PM_NS_DEFAULT && (sts = pmLoadASCIINameSpace(namespace, 1)) < 0) {
111 printf("%s: Cannot load namespace from \"%s\": %s\n", pmProgname, namespace, pmErrStr(sts));
112 exit(1);
115 if (ahtype == 0) {
116 fprintf(stderr, "%s: -a is not optional!\n", pmProgname);
117 exit(1);
119 if ((sts = pmNewContext(ahtype, host)) < 0) {
120 fprintf(stderr, "%s: Cannot open archive \"%s\": %s\n",
121 pmProgname, host, pmErrStr(sts));
122 exit(1);
125 if ((sts = pmGetArchiveLabel(&label)) < 0) {
126 fprintf(stderr, "%s: Cannot get archive label record: %s\n",
127 pmProgname, pmErrStr(sts));
128 exit(1);
131 sts = pmGetArchiveEnd(&tend);
132 if (sts < 0) {
133 printf("pmGetArchiveEnd: %s\n", pmErrStr(sts));
134 exit(1);
137 /* non-flag args are argv[optind] ... argv[argc-1] */
138 if (optind < argc) {
139 numpmid = 0;
140 while (optind < argc && numpmid < 3) {
141 name[numpmid] = argv[optind];
142 printf("metric[%d]: %s\n", numpmid, name[numpmid]);
143 optind++;
144 numpmid++;
148 sts = pmLookupName(numpmid, name, pmid);
149 if (sts < 0) {
150 printf("pmLookupName: %s\n", pmErrStr(sts));
151 exit(1);
154 printf("start: ");
155 printstamp(&label.ll_start);
156 putchar('\n');
157 printf("end: ");
158 printstamp(&tend);
159 putchar('\n');
160 mung(&label.ll_start, &tend, 2, &twant);
161 #if 0
162 msec = 1000 * (twant.tv_sec - label.ll_start.tv_sec) +
163 (twant.tv_usec - label.ll_start.tv_usec) / 1000;
164 #else
165 msec = 100;
166 #endif
167 printf("step: %d msec\n", msec);
168 for (pct = 0; pct <= 100; pct += 10) {
169 __pmLogReads = 0;
170 mung(&label.ll_start, &tend, pct, &twant);
171 printf("%3d%% ", pct);
172 printstamp(&twant);
173 forw = back = 0;
174 sts = pmSetMode(PM_MODE_INTERP, &twant, msec);
175 if (sts < 0) {
176 printf("pmSetMode: %s\n", pmErrStr(sts));
177 exit(1);
179 while (pmFetch(numpmid, pmid, &result) >= 0) {
180 forw++;
181 pmFreeResult(result);
183 printf("%4d forw + ", forw);
184 sts = pmSetMode(PM_MODE_INTERP, &twant, -msec);
185 if (sts < 0) {
186 printf("pmSetMode: %s\n", pmErrStr(sts));
187 exit(1);
189 while (pmFetch(numpmid, pmid, &result) >= 0) {
190 back++;
191 pmFreeResult(result);
193 printf("%4d back = %d, %d log reads\n",
194 back, forw + back, __pmLogReads);
197 exit(0);