diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
commit | 47e6e7c84f008a53061e661f31ae96629bc694ef (patch) | |
tree | 648a07f3b5b9d67ce19b0fd72e8caa1175c98f1a /qa/src/slow_af.c | |
download | pcp-debian.tar.gz |
Debian 3.9.10debian/3.9.10debian
Diffstat (limited to 'qa/src/slow_af.c')
-rw-r--r-- | qa/src/slow_af.c | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/qa/src/slow_af.c b/qa/src/slow_af.c new file mode 100644 index 0000000..78ad458 --- /dev/null +++ b/qa/src/slow_af.c @@ -0,0 +1,152 @@ +#include <pcp/pmapi.h> +#include <pcp/impl.h> + +static struct timeval start; + +#ifdef IS_MINGW +void pause(void) { SleepEx(INFINITE, TRUE); } +#endif + +static int reg[4]; + +static void +printstamp(struct timeval *tp) +{ + static struct tm *tmp; + time_t tt = (time_t)tp->tv_sec; + + tmp = localtime(&tt); + fprintf(stderr, "%02d:%02d:%02d.%06d", tmp->tm_hour, tmp->tm_min, tmp->tm_sec, (int)tp->tv_usec); +} + +void +onevent(int afid, void *data) +{ + struct timeval now; + static int delay = -3; + int evnum; + double elapsed; + struct timeval sec = { 0, 0 }; + + gettimeofday(&now, NULL); + + if (pmDebug & DBG_TRACE_AF) { + fprintf(stderr, "onevent(%d, " PRINTF_P_PFX "%p) called: ", afid, data); + printstamp(&now); + fputc('\n', stderr); + } + + elapsed = now.tv_sec - start.tv_sec + (double)(now.tv_usec - start.tv_usec) / 1000000.0; + + if (afid == reg[2]) + printf("event %d callback\n", afid); + else { + if (afid == reg[0]) + evnum = (int)(elapsed / 2.5); + else + evnum = (int)(elapsed / 1.5); + /* evnum not reliable for small elapsed intervals */ + if (evnum >= 3) + printf("event %d callback #%d\n", afid, evnum); + else + printf("event %d callback #?\n", afid); + } + + if (delay > 6) { + /* only report the unexpected */ + if (__pmAFunregister(reg[0]) < 0) + printf("unregister %d failed\n", reg[0]); + if (__pmAFunregister(reg[1]) == 0) + printf("unregister %d success\n", reg[1]); + if (__pmAFunregister(reg[2]) == 0) + printf("unregister %d success\n", reg[2]); + if (__pmAFunregister(reg[3]) < 0) + printf("unregister %d failed\n", reg[0]); + exit(0); + } + if (delay > 0) { + /* + * was sginap(delay * CLK_TCK) ... usleep() for + * delay*CLK_TCK*10^6/CLK_TCK microseconds so "delay" sec + */ + sec.tv_sec = delay; + __pmtimevalSleep(sec); + } + delay++; + + if (pmDebug & DBG_TRACE_AF) { + gettimeofday(&now, NULL); + fprintf(stderr, "onevent done: "); + printstamp(&now); + fputc('\n', stderr); + } + + fflush(stderr); + fflush(stdout); +} + +int +main(int argc, char **argv) +{ + int c; + int sts; + int errflag = 0; + struct timeval delta = { 2, 500000 }; + struct timeval now; + + __pmSetProgname(argv[0]); + + while ((c = getopt(argc, argv, "D:?")) != EOF) { + switch (c) { + + 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; + + case '?': + default: + errflag++; + break; + } + } + + if (errflag) { + fprintf(stderr, +"Usage: %s options ...\n\ +\n\ +Options\n\ + -D debug standard PCP debug flag\n", + pmProgname); + exit(1); + } + + __pmAFblock(); + gettimeofday(&start, NULL); + reg[0] = __pmAFregister(&delta, NULL, onevent); + delta.tv_sec = 1; + reg[1] = __pmAFregister(&delta, NULL, onevent); + delta.tv_sec = 0; + delta.tv_usec = 0; + reg[2] = __pmAFregister(&delta, NULL, onevent); + delta.tv_sec = 60; /* will never fire */ + reg[3] = __pmAFregister(&delta, NULL, onevent); + __pmAFunblock(); + + for ( ; ; ) { + fflush(stderr); + pause(); + if (pmDebug & DBG_TRACE_AF) { + gettimeofday(&now, NULL); + fprintf(stderr, "returned from pause(): "); + printstamp(&now); + fputc('\n', stderr); + } + } +} |