Annotation of embedaddon/ntp/util/hist.c, revision 1.1
1.1 ! misho 1: /*
! 2: * This program can be used to calibrate the clock reading jitter of a
! 3: * particular CPU and operating system. It first tickles every element
! 4: * of an array, in order to force pages into memory, then repeatedly calls
! 5: * gettimeofday() and, finally, writes out the time values for later
! 6: * analysis. From this you can determine the jitter and if the clock ever
! 7: * runs backwards.
! 8: */
! 9:
! 10: #ifdef HAVE_CONFIG_H
! 11: # include <config.h>
! 12: #endif
! 13:
! 14: #include "ntp_types.h"
! 15:
! 16: #include <stdio.h>
! 17: #include <stdlib.h>
! 18:
! 19: #define NBUF 100001 /* size of basic histogram */
! 20: #define NSRT 20000 /* size of overflow histogram */
! 21: #define NCNT (600 * 1000000) /* sample interval (us) */
! 22:
! 23: int col (long *, long *);
! 24:
! 25: int
! 26: main(
! 27: int argc,
! 28: char *argv[]
! 29: )
! 30: {
! 31: struct timeval ts, tr, tp;
! 32: struct timezone tzp;
! 33: int i, j, n;
! 34: long t, u, v, w, gtod[NBUF], ovfl[NSRT];
! 35:
! 36: /*
! 37: * Force pages into memory
! 38: */
! 39: for (i = 0; i < NBUF; i++)
! 40: gtod[i] = 0;
! 41: for (i = 0; i < NSRT; i++)
! 42: ovfl[i] = 0;
! 43:
! 44: /*
! 45: * Construct histogram
! 46: */
! 47: n = 0;
! 48: gettimeofday(&ts, &tzp);
! 49: t = ts.tv_sec * 1000000 + ts.tv_usec;
! 50: v = t;
! 51: while (1) {
! 52: gettimeofday(&tr, &tzp);
! 53: u = tr.tv_sec * 1000000 + tr.tv_usec;
! 54: if (u - v > NCNT)
! 55: break;
! 56: w = u - t;
! 57: if (w <= 0) {
! 58: /*
! 59: printf("error <= 0 %ld %d %d, %d %d\n", w, ts.tv_sec,
! 60: ts.tv_usec, tr.tv_sec, tr.tv_usec);
! 61: */
! 62: } else if (w > NBUF - 1) {
! 63: ovfl[n] = w;
! 64: if (n < NSRT - 1)
! 65: n++;
! 66: } else {
! 67: gtod[w]++;
! 68: }
! 69: ts = tr;
! 70: t = u;
! 71: }
! 72:
! 73: /*
! 74: * Write out histogram
! 75: */
! 76: for (i = 0; i < NBUF - 1; i++) {
! 77: if (gtod[i] > 0)
! 78: printf("%ld %ld\n", i, gtod[i]);
! 79: }
! 80: if (n == 0)
! 81: return;
! 82: qsort(
! 83: #ifdef QSORT_USES_VOID_P
! 84: (void *)
! 85: #else
! 86: (char *)
! 87: #endif
! 88: ovfl, (size_t)n, sizeof(long), col);
! 89: w = 0;
! 90: j = 0;
! 91: for (i = 0; i < n; i++) {
! 92: if (ovfl[i] != w) {
! 93: if (j > 0)
! 94: printf("%ld %ld\n", w, j);
! 95: w = ovfl[i];
! 96: j = 1;
! 97: } else
! 98: j++;
! 99: }
! 100: if (j > 0)
! 101: printf("%ld %ld\n", w, j);
! 102:
! 103: exit(0);
! 104: }
! 105:
! 106: int
! 107: col(
! 108: long *x,
! 109: long *y
! 110: )
! 111: {
! 112: return (*x - *y);
! 113: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>