Annotation of embedaddon/ntp/util/hist.c, revision 1.1.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>