First real version of utility library.
[dyninst.git] / common / h / hist.h
1 #ifndef HIST
2 #define HIST
3
4 #include "util/list.h"
5 #include "rtinst/trace.h"
6
7 #ifndef False
8 #define False   0
9 #define True    1
10 #endif
11
12 typedef double timeStamp;
13
14 typedef struct {
15     timeStamp start;
16     timeStamp end;
17     sampleValue value;
18 } Interval;
19
20 typedef enum { HistInterval, HistBucket } histType;
21 typedef enum { HistNewValue, HistNewTimeBase } callType;
22 typedef sampleValue Bin;
23
24 typedef void (*subscriberCallBack)(callType, timeStamp, void* userData);
25 class Histogram;
26
27 /*
28  * upcall mechanism for routines that need to find out about changes to
29  *   a histogram.
30  *
31  */
32 class HistogramSubscriber {
33         friend Histogram;
34     public:
35         HistogramSubscriber(timeStamp maxRate, subscriberCallBack func, void *userData);
36         deliver(int bin);
37     private:
38         void *userData;
39         timeStamp interval;
40         timeStamp lastCall;
41         subscriberCallBack callBack; 
42 };
43
44 typedef enum { histActive, histInactive } histStatus;
45 typedef enum { histSum, histAverage } histCompact;
46 typedef enum { histSplit, histSet } histAddMode;
47 typedef enum { EventCounter, SampledFunction } metricStyle;
48
49 class Histogram {
50         friend class histDisplay;
51         void newDataFunc(callType type, timeStamp time, void* userData);
52     public:
53         Histogram(metricStyle);
54         Histogram(Bin *buckets, metricStyle);
55         void enable() { status = histActive; }
56         void disable() { status = histInactive; }
57         sampleValue getValue();
58         sampleValue getValue(timeStamp start, timeStamp end);
59         void addInterval(timeStamp start, timeStamp end, 
60             sampleValue value, Boolean smooth);
61         void addPoint(timeStamp start, sampleValue value) {
62             addInterval(start, start, value, False);
63         }
64         int subscribe(timeStamp maxRate,subscriberCallBack func,void *);
65         void unsubscribe(int id) { 
66                 subscribers.remove((HistogramSubscriber*)id); 
67         }
68         timeStamp currentTime() { 
69                 return((timeStamp)(lastGlobalBin*bucketSize)); 
70         }
71         static int numBins;             /* max bins to use */
72     private:
73         void foldAllHist();
74         void convertToBins();
75         void bucketValue(timeStamp start, timeStamp end, 
76                 sampleValue value, Boolean smooth);
77
78         static timeStamp bucketSize;    /* width of a bucket */
79         static timeStamp total_time;    /* numBins * bucketSize */
80         static int lastGlobalBin;       /* global point we have data from */
81         static Histogram *allHist;      /* linked list of all histograms */
82
83         Histogram *next;                /* linked list of all histograms */
84         int lastBin;                    /* current (for this hist) last bin */
85
86         histType storageType;   
87         Boolean smooth;         /* prevent values greater than binWidth */
88         metricStyle metricType; /* sampled function or event counter */
89         int intervalCount;      /* # of intervals in use */
90         int intervalLimit;      /* # of intervals in use */
91         union {
92             Bin *buckets;
93             Interval *intervals;
94         } dataPtr; 
95         List<HistogramSubscriber*> subscribers;
96         histStatus status;
97 };
98
99 #endif