Added an upcall to dyninstRPC.I to allow paradynd's to report information at
[dyninst.git] / paradyn / src / PCthread / PCmetric.h
1 /*
2  * 
3  * $Log: PCmetric.h,v $
4  * Revision 1.2  1994/02/24 04:36:49  markc
5  * Added an upcall to dyninstRPC.I to allow paradynd's to report information at
6  * startup.  Added a data member to the class that igen generates.
7  * Make depend differences due to new header files that igen produces.
8  * Added support to allow asynchronous starts of paradynd's.  The dataManager has
9  * an advertised port that new paradynd's can connect to.
10  * Changed header files to reflect changes in igen.
11  *
12  * Revision 1.1  1994/02/02  00:38:17  hollings
13  * First version of the Performance Consultant using threads.
14  *
15  * Revision 1.8  1993/09/03  19:02:42  hollings
16  * added findMetric, removed 4th arg to value.
17  *
18  * Revision 1.7  1993/08/30  18:36:29  hollings
19  * added getCollectionCost to collectMode
20  * added samplesSinceEnable to datum.
21  *
22  * Revision 1.6  1993/08/05  19:00:28  hollings
23  * added getUnits and new includes.
24  *
25  * Revision 1.5  1993/05/07  20:19:17  hollings
26  * Upgrade to use dyninst interface.
27  *
28  * Revision 1.4  1992/12/14  19:58:27  hollings
29  * added true enable/disable.
30  *
31  * Revision 1.3  1992/10/23  20:13:37  hollings
32  * Working version right after prelim.
33  *
34  * Revision 1.2  1992/08/24  15:12:20  hollings
35  * first cut at automated refinement.
36  *
37  * Revision 1.1  1992/08/03  20:45:54  hollings
38  * Initial revision
39  *
40  *
41  */
42
43 #ifndef METRIC_H
44 #define METRIC_H
45
46 #include "util/h/hist.h"
47 #include "dataManager.CLNT.h"
48 #include "PCwhere.h"
49 #include "PCwhen.h"
50
51 extern dataManagerUser *dataMgr;
52
53 typedef enum { 
54     getCollectionCost, 
55     enableCollection, 
56     disableCollection,
57 } collectMode;
58
59
60 // How do we compine multipe metrics of this type
61 enum aggregation { Sum, Min, Max, Avg };
62
63 // do we normalize by the windowWidth
64 enum calcType { CalcSum, CalcNormalize };
65
66 enum warningLevel { wNever, wOnce, wAlways };
67
68 extern warningLevel noDataWarning;
69 extern timeStamp currentTime;
70
71 class datum {
72     public:
73         void newSample(timeStamp start, timeStamp end, sampleValue value);
74
75         datum();
76         focus           *f;
77         resourceList    *resList;               // maps to inst level data.
78
79         // data for previous enables.
80         sampleValue     sample;                 // total of previous enables.
81         timeStamp       totalUsed;              // total time enable previous.
82
83         timeStamp       enableTime;             // this time enabled.
84         timeStamp       lastUsed;               // this time enabled.
85         int             samplesSinceEnable;     // this time enabled.
86
87         timeStamp       time;
88         Boolean         used;
89         Boolean         enabled;
90         int             refCount;
91         metricInstance  *mi;                    // when enabled.
92
93         Histogram       *hist;
94 };
95
96 class performanceConsultant;
97 //
98 // The name of some performance data.
99 //
100 class PCmetric {
101         friend void printMetric(char *, focus*, timeStamp, timeStamp);
102         friend void PCmetricFunc(performanceStream *ps, metric *met);
103         friend void printStats();
104         friend void globalCost();
105     public:
106         // Constructor - default is Sum to aggregate.
107         void print();
108
109         char *getName() { return(name); }
110         char *getUnits() { 
111             metricInfo *info;
112
113             info = dataMgr->getMetricInfo(met);
114             return(info->units); 
115         }
116         datum *findDatum(focus *f) { return(samples.find(f->getName())); }
117         void addDatum(datum *d) { 
118             samples.add(d, (void *) d->f->getName()); 
119         }
120
121         Boolean changeCollection(collectMode);          // currentFocus
122         Boolean changeCollection(focus*, collectMode);  // explicit focus.
123         Boolean changeCollection(focusList, collectMode);// explicit focus.
124         PCmetric(char *, aggregation, calcType);
125         PCmetric(char *);
126
127         // Get back values.
128         sampleValue value();                    // for current global state.
129         sampleValue value(focus*);              // for a single focus object.
130         sampleValue value(focusList);           // apply default aggregation.
131         sampleValue value(timeStamp,timeStamp); // for current global state.
132
133         // is this enabled?
134         Boolean enabled(focus*);                // for a single focus object.
135
136         // for a single focus object.
137         sampleValue value(focus*,timeStamp,timeStamp);
138
139         // apply default aggregation.
140         sampleValue value(focusList,timeStamp,timeStamp);       
141
142
143         // explicit calls to aggregation.
144         sampleValue avg(focusList, timeStamp, timeStamp);
145         sampleValue min(focusList, timeStamp, timeStamp);
146         sampleValue max(focusList, timeStamp, timeStamp);
147         sampleValue sum(focusList, timeStamp, timeStamp);
148
149         //
150         sampleValue avg(focusList fl) { 
151              return avg(fl, currentInterval->start, currentTime); 
152         }
153         sampleValue min(focusList fl) { 
154             return avg(fl, currentInterval->start, currentTime); 
155         }
156         sampleValue max(focusList fl) { 
157             return avg(fl, currentInterval->start, currentTime); 
158         }
159         sampleValue sum(focusList fl) { 
160             return avg(fl, currentInterval->start, currentTime); 
161         }
162     private:
163         char *name;
164         metric  *met;           // handle to inst.
165         List<datum*> samples;
166         aggregation aggregationOperator;
167         calcType calc;
168 };
169
170 extern PCmetric *findMetric(char *name);
171
172 //
173 // list of PCmetric.
174 //
175 typedef HTable<PCmetric*> PCmetricList;
176
177 typedef HTable<datum*> datumList;
178
179 extern datumList miToDatumMap;
180 extern void aggregateHist();
181
182 // list each PCmetric 
183
184 extern PCmetric CPUtime;
185 extern PCmetric SyncTime;
186 extern PCmetric SyncOps;
187 extern PCmetric lockHoldingTime;
188 extern PCmetric IOwait;
189 extern PCmetric IOops;
190 extern PCmetric IOBytes;
191 extern PCmetric seekWait;
192 extern PCmetric elapsedTime;
193 extern PCmetric activeProcesses;
194
195 // EDCU based PCmetrics.
196 extern PCmetric systemTime;
197 extern PCmetric runningProcesses;
198 extern PCmetric runableProcesses;
199 extern PCmetric systemCallRate;
200 extern PCmetric contextSwitchRate;
201 extern PCmetric interuptRate;
202 extern PCmetric trapRate;
203 extern PCmetric procedureCalls;
204 extern PCmetric packetsIn;
205 extern PCmetric packetsOut;
206 extern PCmetric pageFaults;
207 extern PCmetric pageReclaims;
208 extern PCmetric dirtyPageReclaims;
209 extern PCmetric zeroPageCreates;
210 extern PCmetric codePageIns;
211 extern PCmetric dataPageIns;
212 extern PCmetric pageOuts;
213 extern PCmetric swapIn;
214 extern PCmetric swapOut;
215 extern PCmetric vmDeficit;
216 extern PCmetric vmFree;
217 extern PCmetric vmDirty;
218 extern PCmetric activeVM;
219
220 // 
221 extern PCmetricList allMetrics;
222
223 #endif