2 * Copyright (c) 1997-2001 Silicon Graphics, Inc. All Rights Reserved.
6 * interp2 - random offset PM_MODE_INTERP exercises
13 mung(struct timeval
*start
, struct timeval
*end
,
14 int pct
, struct timeval
*mid
)
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) {
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));
41 main(int argc
, char **argv
)
47 char *host
= NULL
; /* pander to gcc */
48 pmLogLabel label
; /* get hostname for archives */
49 char *namespace = PM_NS_DEFAULT
;
59 char *name
[] = { "sample.seconds", "sample.drift", "sample.milliseconds" };
61 __pmSetProgname(argv
[0]);
63 while ((c
= getopt(argc
, argv
, "a:D:n:?")) != EOF
) {
66 case 'a': /* archive name */
68 fprintf(stderr
, "%s: at most one of -a and/or -h allowed\n", pmProgname
);
71 ahtype
= PM_CONTEXT_ARCHIVE
;
75 case 'D': /* debug flag */
76 sts
= __pmParseDebug(optarg
);
78 fprintf(stderr
, "%s: unrecognized debug flag specification (%s)\n",
87 case 'n': /* alternative name space file */
100 "Usage: %s 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",
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
));
116 fprintf(stderr
, "%s: -a is not optional!\n", pmProgname
);
119 if ((sts
= pmNewContext(ahtype
, host
)) < 0) {
120 fprintf(stderr
, "%s: Cannot open archive \"%s\": %s\n",
121 pmProgname
, host
, pmErrStr(sts
));
125 if ((sts
= pmGetArchiveLabel(&label
)) < 0) {
126 fprintf(stderr
, "%s: Cannot get archive label record: %s\n",
127 pmProgname
, pmErrStr(sts
));
131 sts
= pmGetArchiveEnd(&tend
);
133 printf("pmGetArchiveEnd: %s\n", pmErrStr(sts
));
137 /* non-flag args are argv[optind] ... argv[argc-1] */
140 while (optind
< argc
&& numpmid
< 3) {
141 name
[numpmid
] = argv
[optind
];
142 printf("metric[%d]: %s\n", numpmid
, name
[numpmid
]);
148 sts
= pmLookupName(numpmid
, name
, pmid
);
150 printf("pmLookupName: %s\n", pmErrStr(sts
));
155 printstamp(&label
.ll_start
);
160 mung(&label
.ll_start
, &tend
, 2, &twant
);
162 msec
= 1000 * (twant
.tv_sec
- label
.ll_start
.tv_sec
) +
163 (twant
.tv_usec
- label
.ll_start
.tv_usec
) / 1000;
167 printf("step: %d msec\n", msec
);
168 for (pct
= 0; pct
<= 100; pct
+= 10) {
170 mung(&label
.ll_start
, &tend
, pct
, &twant
);
171 printf("%3d%% ", pct
);
174 sts
= pmSetMode(PM_MODE_INTERP
, &twant
, msec
);
176 printf("pmSetMode: %s\n", pmErrStr(sts
));
179 while (pmFetch(numpmid
, pmid
, &result
) >= 0) {
181 pmFreeResult(result
);
183 printf("%4d forw + ", forw
);
184 sts
= pmSetMode(PM_MODE_INTERP
, &twant
, -msec
);
186 printf("pmSetMode: %s\n", pmErrStr(sts
));
189 while (pmFetch(numpmid
, pmid
, &result
) >= 0) {
191 pmFreeResult(result
);
193 printf("%4d back = %d, %d log reads\n",
194 back
, forw
+ back
, __pmLogReads
);