Home | History | Annotate | Download | only in src
      1 #if TIME_WITH_SYS_TIME
      2 # include <sys/time.h>
      3 # include <time.h>
      4 #else
      5 # if HAVE_SYS_TIME_H
      6 #  include <sys/time.h>
      7 # else
      8 #  include <time.h>
      9 # endif
     10 #endif
     11 #ifdef WIN32
     12 #  include "missing\stdint.h"
     13 #endif
     14 
     15 /* hist.h
     16 
     17    Given a time difference in microseconds, increment one of 61
     18    different buckets:
     19 
     20    0 - 9 in increments of 1 usec
     21    0 - 9 in increments of 10 usecs
     22    0 - 9 in increments of 100 usecs
     23    0 - 9 in increments of 1 msec
     24    0 - 9 in increments of 10 msecs
     25    0 - 9 in increments of 100 msecs
     26    0 - 9 in increments of 1 sec
     27    0 - 9 in increments of 10 sec
     28    > 100 secs
     29 
     30    This will allow any time to be recorded to within an accuracy of
     31    10%, and provides a compact representation for capturing the
     32    distribution of a large number of time differences (e.g.
     33    request-response latencies).
     34 
     35    Colin Low  10/6/93
     36    Rick Jones 2004-06-15 - extend to 1 and 10 usec
     37 */
     38 #ifndef _HIST_INCLUDED
     39 #define _HIST_INCLUDED
     40 
     41 #if defined(HAVE_GET_HRT)
     42 #include "hrt.h"
     43 #endif
     44 
     45 #ifndef HIST_NUM_OF_BUCKET
     46 #define HIST_NUM_OF_BUCKET 100
     47 #endif
     48 
     49 struct histogram_struct {
     50   int unit_usec[HIST_NUM_OF_BUCKET];
     51   int ten_usec[HIST_NUM_OF_BUCKET];
     52   int hundred_usec[HIST_NUM_OF_BUCKET];
     53   int unit_msec[HIST_NUM_OF_BUCKET];
     54   int ten_msec[HIST_NUM_OF_BUCKET];
     55   int hundred_msec[HIST_NUM_OF_BUCKET];
     56   int unit_sec[HIST_NUM_OF_BUCKET];
     57   int ten_sec[HIST_NUM_OF_BUCKET];
     58   int ridiculous;
     59   int total;
     60   int64_t sum;
     61   double sumsquare;
     62   int hmin;
     63   int hmax;
     64   int limit;
     65   int count;
     66   int producer;
     67   int consumer;
     68 #ifdef HAVE_GETHRTIME
     69   hrtime_t *time_ones;
     70   hrtime_t time_two;
     71 #elif HAVE_GET_HRT
     72   hrt_t *time_ones;
     73   hrt_t time_two;
     74 #elif defined(WIN32)
     75   LARGE_INTEGER *time_ones;
     76   LARGE_INTEGER time_two;
     77 #else
     78   struct timeval *time_ones;
     79   struct timeval time_two;
     80 #endif /* HAVE_GETHRTIME */
     81 
     82 };
     83 
     84 typedef struct histogram_struct *HIST;
     85 
     86 /*
     87    HIST_new - return a new, cleared histogram data type
     88 */
     89 
     90 HIST HIST_new(void);
     91 
     92 /*
     93    HIST_new_n - return a new, cleard histogram data type able to track
     94    at least max_outstanding timestamps
     95 */
     96 
     97 HIST HIST_new_n(int max_outstanding);
     98 
     99 /*
    100    HIST_clear - reset a histogram by clearing all totals to zero
    101 */
    102 
    103 
    104 void HIST_clear(HIST h);
    105 
    106 /*
    107    HIST_purge - forget about any remaining outstanding timestamps
    108    being tracked
    109 */
    110 
    111 void HIST_purge(HIST h);
    112 
    113 /*
    114    HIST_add - add a time difference to a histogram. Time should be in
    115    microseconds.
    116 */
    117 
    118 void HIST_add(register HIST h, int time_delta);
    119 
    120 /*
    121   HIST_report - create an ASCII report on the contents of a histogram.
    122   Currently printsto standard out
    123 */
    124 
    125 void HIST_report(HIST h);
    126 
    127 /*
    128   HIST_timestamp - take a timestamp suitable for use in a histogram.
    129 */
    130 
    131 #ifdef HAVE_GETHRTIME
    132 void HIST_timestamp(hrtime_t *timestamp);
    133 #elif defined(HAVE_GET_HRT)
    134 void HIST_timestamp(hrt_t *timestamp);
    135 #elif defined(WIN32)
    136 void HIST_timestamp(LARGE_INTEGER *timestamp);
    137 #else
    138 void HIST_timestamp(struct timeval *timestamp);
    139 #endif
    140 
    141 /*
    142   HIST_timestamp_start - start a new timestamp
    143 */
    144 
    145 void HIST_timestamp_start(HIST h);
    146 
    147 /*
    148   HIST_timestamp_stop_add - complete the oldest outstanding timestamp
    149   and add it to the histogram
    150 */
    151 
    152 void HIST_timestamp_stop_add(HIST h);
    153 
    154 /*
    155   delta_micro - calculate the difference in microseconds between two
    156   timestamps
    157 */
    158 #ifdef HAVE_GETHRTIME
    159 int delta_micro(hrtime_t *begin, hrtime_t *end);
    160 #elif defined(HAVE_GET_HRT)
    161 int delta_micro(hrt_t *begin, hrt_t *end);
    162 #elif defined(WIN32)
    163 int delta_micro(LARGE_INTEGER *begin, LARGE_INTEGER *end);
    164 #else
    165 int delta_micro(struct timeval *begin, struct timeval *end);
    166 #endif
    167 
    168 #endif
    169 
    170