#if TIME_WITH_SYS_TIME # include <sys/time.h> # include <time.h> #else # if HAVE_SYS_TIME_H # include <sys/time.h> # else # include <time.h> # endif #endif #ifdef WIN32 # include "missing\stdint.h" #endif /* hist.h Given a time difference in microseconds, increment one of 61 different buckets: 0 - 9 in increments of 1 usec 0 - 9 in increments of 10 usecs 0 - 9 in increments of 100 usecs 0 - 9 in increments of 1 msec 0 - 9 in increments of 10 msecs 0 - 9 in increments of 100 msecs 0 - 9 in increments of 1 sec 0 - 9 in increments of 10 sec > 100 secs This will allow any time to be recorded to within an accuracy of 10%, and provides a compact representation for capturing the distribution of a large number of time differences (e.g. request-response latencies). Colin Low 10/6/93 Rick Jones 2004-06-15 - extend to 1 and 10 usec */ #ifndef _HIST_INCLUDED #define _HIST_INCLUDED #if defined(HAVE_GET_HRT) #include "hrt.h" #endif #ifndef HIST_NUM_OF_BUCKET #define HIST_NUM_OF_BUCKET 100 #endif struct histogram_struct { int unit_usec[HIST_NUM_OF_BUCKET]; int ten_usec[HIST_NUM_OF_BUCKET]; int hundred_usec[HIST_NUM_OF_BUCKET]; int unit_msec[HIST_NUM_OF_BUCKET]; int ten_msec[HIST_NUM_OF_BUCKET]; int hundred_msec[HIST_NUM_OF_BUCKET]; int unit_sec[HIST_NUM_OF_BUCKET]; int ten_sec[HIST_NUM_OF_BUCKET]; int ridiculous; int total; int64_t sum; double sumsquare; int hmin; int hmax; int limit; int count; int producer; int consumer; #ifdef HAVE_GETHRTIME hrtime_t *time_ones; hrtime_t time_two; #elif HAVE_GET_HRT hrt_t *time_ones; hrt_t time_two; #elif defined(WIN32) LARGE_INTEGER *time_ones; LARGE_INTEGER time_two; #else struct timeval *time_ones; struct timeval time_two; #endif /* HAVE_GETHRTIME */ }; typedef struct histogram_struct *HIST; /* HIST_new - return a new, cleared histogram data type */ HIST HIST_new(void); /* HIST_new_n - return a new, cleard histogram data type able to track at least max_outstanding timestamps */ HIST HIST_new_n(int max_outstanding); /* HIST_clear - reset a histogram by clearing all totals to zero */ void HIST_clear(HIST h); /* HIST_purge - forget about any remaining outstanding timestamps being tracked */ void HIST_purge(HIST h); /* HIST_add - add a time difference to a histogram. Time should be in microseconds. */ void HIST_add(register HIST h, int time_delta); /* HIST_report - create an ASCII report on the contents of a histogram. Currently printsto standard out */ void HIST_report(HIST h); /* HIST_timestamp - take a timestamp suitable for use in a histogram. */ #ifdef HAVE_GETHRTIME void HIST_timestamp(hrtime_t *timestamp); #elif defined(HAVE_GET_HRT) void HIST_timestamp(hrt_t *timestamp); #elif defined(WIN32) void HIST_timestamp(LARGE_INTEGER *timestamp); #else void HIST_timestamp(struct timeval *timestamp); #endif /* HIST_timestamp_start - start a new timestamp */ void HIST_timestamp_start(HIST h); /* HIST_timestamp_stop_add - complete the oldest outstanding timestamp and add it to the histogram */ void HIST_timestamp_stop_add(HIST h); /* delta_micro - calculate the difference in microseconds between two timestamps */ #ifdef HAVE_GETHRTIME int delta_micro(hrtime_t *begin, hrtime_t *end); #elif defined(HAVE_GET_HRT) int delta_micro(hrt_t *begin, hrt_t *end); #elif defined(WIN32) int delta_micro(LARGE_INTEGER *begin, LARGE_INTEGER *end); #else int delta_micro(struct timeval *begin, struct timeval *end); #endif #endif