| rev |
line source |
|
seanhalle@208
|
1 /*
|
|
seanhalle@208
|
2 * Copyright 2010 OpenSourceStewardshipFoundation
|
|
seanhalle@208
|
3 *
|
|
seanhalle@208
|
4 * Licensed under BSD
|
|
seanhalle@208
|
5 */
|
|
seanhalle@208
|
6
|
|
seanhalle@208
|
7 #include <stdio.h>
|
|
seanhalle@208
|
8 #include <malloc.h>
|
|
seanhalle@208
|
9 #include <sys/time.h>
|
|
seanhalle@208
|
10
|
|
seanhalle@208
|
11 #include "VMS.h"
|
|
seanhalle@208
|
12
|
|
seanhalle@208
|
13
|
|
seanhalle@208
|
14
|
|
seanhalle@208
|
15 //==================== Probes =================
|
|
seanhalle@208
|
16 #ifdef STATS__USE_TSC_PROBES
|
|
seanhalle@208
|
17
|
|
seanhalle@208
|
18 int32
|
|
seanhalle@208
|
19 VMS__create_histogram_probe( int32 numBins, float32 startValue,
|
|
seanhalle@208
|
20 float32 binWidth, char *nameStr )
|
|
seanhalle@208
|
21 { IntervalProbe *newProbe;
|
|
seanhalle@208
|
22 int32 idx;
|
|
seanhalle@208
|
23 FloatHist *hist;
|
|
seanhalle@208
|
24
|
|
seanhalle@208
|
25 idx = VMS__create_single_interval_probe( nameStr );
|
|
seanhalle@208
|
26 newProbe = _VMSMasterEnv->intervalProbes[ idx ];
|
|
seanhalle@208
|
27
|
|
seanhalle@208
|
28 hist = makeFloatHistogram( numBins, startValue, binWidth );
|
|
seanhalle@208
|
29 newProbe->hist = hist;
|
|
seanhalle@208
|
30 return idx;
|
|
seanhalle@208
|
31 }
|
|
seanhalle@208
|
32
|
|
seanhalle@208
|
33 void
|
|
seanhalle@208
|
34 VMS_impl__record_interval_start_in_probe( int32 probeID )
|
|
seanhalle@208
|
35 { IntervalProbe *probe;
|
|
seanhalle@208
|
36
|
|
seanhalle@208
|
37 probe = _VMSMasterEnv->intervalProbes[ probeID ];
|
|
seanhalle@208
|
38 probe->startStamp = getTSCount();
|
|
seanhalle@208
|
39 }
|
|
seanhalle@208
|
40
|
|
seanhalle@208
|
41 void
|
|
seanhalle@208
|
42 VMS_impl__record_interval_end_in_probe( int32 probeID )
|
|
seanhalle@208
|
43 { IntervalProbe *probe;
|
|
seanhalle@208
|
44 TSCount endStamp;
|
|
seanhalle@208
|
45
|
|
seanhalle@208
|
46 endStamp = getTSCount();
|
|
seanhalle@208
|
47
|
|
seanhalle@208
|
48 probe = _VMSMasterEnv->intervalProbes[ probeID ];
|
|
seanhalle@208
|
49 probe->endStamp = endStamp;
|
|
seanhalle@208
|
50
|
|
seanhalle@208
|
51 if( probe->hist != NULL )
|
|
seanhalle@208
|
52 { TSCount interval = probe->endStamp - probe->startStamp;
|
|
seanhalle@208
|
53 //if the interval is sane, then add to histogram
|
|
seanhalle@208
|
54 if( interval < probe->hist->endOfRange * 10 )
|
|
seanhalle@208
|
55 addToFloatHist( interval, probe->hist );
|
|
seanhalle@208
|
56 }
|
|
seanhalle@208
|
57 }
|
|
seanhalle@208
|
58
|
|
seanhalle@208
|
59 void
|
|
seanhalle@208
|
60 VMS_impl__print_stats_of_probe( int32 probeID )
|
|
seanhalle@208
|
61 { IntervalProbe *probe;
|
|
seanhalle@208
|
62
|
|
seanhalle@208
|
63 probe = _VMSMasterEnv->intervalProbes[ probeID ];
|
|
seanhalle@208
|
64
|
|
seanhalle@208
|
65 if( probe->hist == NULL )
|
|
seanhalle@208
|
66 {
|
|
seanhalle@208
|
67 printf("probe: %s, interval: %.6lf\n", probe->nameStr,probe->interval);
|
|
seanhalle@208
|
68 }
|
|
seanhalle@208
|
69
|
|
seanhalle@208
|
70 else
|
|
seanhalle@208
|
71 {
|
|
seanhalle@208
|
72 printf( "probe: %s\n", probe->nameStr );
|
|
seanhalle@208
|
73 printFloatHist( probe->hist );
|
|
seanhalle@208
|
74 }
|
|
seanhalle@208
|
75 }
|
|
seanhalle@208
|
76 #else
|
|
seanhalle@208
|
77
|
|
seanhalle@208
|
78 /*
|
|
seanhalle@208
|
79 * In practice, probe operations are called from the app, from inside slaves
|
|
seanhalle@208
|
80 * -- so have to be sure each probe is single-VP owned, and be sure that
|
|
seanhalle@208
|
81 * any place common structures are modified it's done inside the master.
|
|
seanhalle@208
|
82 * So -- the only place common structures are modified is during creation.
|
|
seanhalle@208
|
83 * after that, all mods are to individual instances.
|
|
seanhalle@208
|
84 *
|
|
seanhalle@208
|
85 * Thniking perhaps should change the semantics to be that probes are
|
|
seanhalle@208
|
86 * attached to the virtual processor -- and then everything is guaranteed
|
|
seanhalle@208
|
87 * to be isolated -- except then can't take any intervals that span VPs,
|
|
seanhalle@208
|
88 * and would have to transfer the probes to Master env when VP dissipates..
|
|
seanhalle@208
|
89 * gets messy..
|
|
seanhalle@208
|
90 *
|
|
seanhalle@208
|
91 * For now, just making so that probe creation causes a suspend, so that
|
|
seanhalle@208
|
92 * the dynamic array in the master env is only modified from the master
|
|
seanhalle@208
|
93 *
|
|
seanhalle@208
|
94 */
|
|
seanhalle@208
|
95 IntervalProbe *
|
|
seanhalle@208
|
96 create_generic_probe( char *nameStr, SlaveVP *animPr )
|
|
seanhalle@208
|
97 {
|
|
seanhalle@208
|
98 VMSSemReq reqData;
|
|
seanhalle@208
|
99
|
|
seanhalle@208
|
100 reqData.reqType = createProbe;
|
|
seanhalle@208
|
101 reqData.nameStr = nameStr;
|
|
seanhalle@208
|
102
|
|
seanhalle@208
|
103 VMS_WL__send_VMSSem_request( &reqData, animPr );
|
|
seanhalle@208
|
104
|
|
seanhalle@208
|
105 return animPr->dataRetFromReq;
|
|
seanhalle@208
|
106 }
|
|
seanhalle@208
|
107
|
|
seanhalle@208
|
108 /*Use this version from outside VMS -- it uses external malloc, and modifies
|
|
seanhalle@208
|
109 * dynamic array, so can't be animated in a slave VP
|
|
seanhalle@208
|
110 */
|
|
seanhalle@208
|
111 IntervalProbe *
|
|
seanhalle@208
|
112 ext__create_generic_probe( char *nameStr )
|
|
seanhalle@208
|
113 { IntervalProbe *newProbe;
|
|
seanhalle@208
|
114 int32 nameLen;
|
|
seanhalle@208
|
115
|
|
seanhalle@208
|
116 newProbe = malloc( sizeof(IntervalProbe) );
|
|
seanhalle@208
|
117 nameLen = strlen( nameStr );
|
|
seanhalle@208
|
118 newProbe->nameStr = malloc( nameLen );
|
|
seanhalle@208
|
119 memcpy( newProbe->nameStr, nameStr, nameLen );
|
|
seanhalle@208
|
120 newProbe->hist = NULL;
|
|
seanhalle@208
|
121 newProbe->schedChoiceWasRecorded = FALSE;
|
|
seanhalle@208
|
122 newProbe->probeID =
|
|
seanhalle@208
|
123 addToDynArray( newProbe, _VMSMasterEnv->dynIntervalProbesInfo );
|
|
seanhalle@208
|
124
|
|
seanhalle@208
|
125 return newProbe;
|
|
seanhalle@208
|
126 }
|
|
seanhalle@208
|
127
|
|
seanhalle@208
|
128
|
|
seanhalle@208
|
129 /*Only call from inside master or main startup/shutdown thread
|
|
seanhalle@208
|
130 */
|
|
seanhalle@208
|
131 void
|
|
seanhalle@208
|
132 VMS_impl__free_probe( IntervalProbe *probe )
|
|
seanhalle@208
|
133 { if( probe->hist != NULL ) freeDblHist( probe->hist );
|
|
seanhalle@208
|
134 if( probe->nameStr != NULL) VMS_int__free( probe->nameStr );
|
|
seanhalle@208
|
135 VMS_int__free( probe );
|
|
seanhalle@208
|
136 }
|
|
seanhalle@208
|
137
|
|
seanhalle@208
|
138
|
|
seanhalle@208
|
139 int32
|
|
seanhalle@208
|
140 VMS_impl__record_time_point_into_new_probe( char *nameStr, SlaveVP *animPr)
|
|
seanhalle@208
|
141 { IntervalProbe *newProbe;
|
|
seanhalle@208
|
142 struct timeval *startStamp;
|
|
seanhalle@208
|
143 float64 startSecs;
|
|
seanhalle@208
|
144
|
|
seanhalle@208
|
145 newProbe = create_generic_probe( nameStr, animPr );
|
|
seanhalle@208
|
146 newProbe->endSecs = 0;
|
|
seanhalle@208
|
147
|
|
seanhalle@208
|
148 gettimeofday( &(newProbe->startStamp), NULL);
|
|
seanhalle@208
|
149
|
|
seanhalle@208
|
150 //turn into a double
|
|
seanhalle@208
|
151 startStamp = &(newProbe->startStamp);
|
|
seanhalle@208
|
152 startSecs = startStamp->tv_sec + ( startStamp->tv_usec / 1000000.0 );
|
|
seanhalle@208
|
153 newProbe->startSecs = startSecs;
|
|
seanhalle@208
|
154
|
|
seanhalle@208
|
155 return newProbe->probeID;
|
|
seanhalle@208
|
156 }
|
|
seanhalle@208
|
157
|
|
seanhalle@208
|
158 int32
|
|
seanhalle@208
|
159 VMS_ext_impl__record_time_point_into_new_probe( char *nameStr )
|
|
seanhalle@208
|
160 { IntervalProbe *newProbe;
|
|
seanhalle@208
|
161 struct timeval *startStamp;
|
|
seanhalle@208
|
162 float64 startSecs;
|
|
seanhalle@208
|
163
|
|
seanhalle@208
|
164 newProbe = ext__create_generic_probe( nameStr );
|
|
seanhalle@208
|
165 newProbe->endSecs = 0;
|
|
seanhalle@208
|
166
|
|
seanhalle@208
|
167 gettimeofday( &(newProbe->startStamp), NULL);
|
|
seanhalle@208
|
168
|
|
seanhalle@208
|
169 //turn into a double
|
|
seanhalle@208
|
170 startStamp = &(newProbe->startStamp);
|
|
seanhalle@208
|
171 startSecs = startStamp->tv_sec + ( startStamp->tv_usec / 1000000.0 );
|
|
seanhalle@208
|
172 newProbe->startSecs = startSecs;
|
|
seanhalle@208
|
173
|
|
seanhalle@208
|
174 return newProbe->probeID;
|
|
seanhalle@208
|
175 }
|
|
seanhalle@208
|
176
|
|
seanhalle@208
|
177 int32
|
|
seanhalle@208
|
178 VMS_impl__create_single_interval_probe( char *nameStr, SlaveVP *animPr )
|
|
seanhalle@208
|
179 { IntervalProbe *newProbe;
|
|
seanhalle@208
|
180
|
|
seanhalle@208
|
181 newProbe = create_generic_probe( nameStr, animPr );
|
|
seanhalle@208
|
182
|
|
seanhalle@208
|
183 return newProbe->probeID;
|
|
seanhalle@208
|
184 }
|
|
seanhalle@208
|
185
|
|
seanhalle@208
|
186 int32
|
|
seanhalle@208
|
187 VMS_impl__create_histogram_probe( int32 numBins, float64 startValue,
|
|
seanhalle@208
|
188 float64 binWidth, char *nameStr, SlaveVP *animPr )
|
|
seanhalle@208
|
189 { IntervalProbe *newProbe;
|
|
seanhalle@208
|
190 DblHist *hist;
|
|
seanhalle@208
|
191
|
|
seanhalle@208
|
192 newProbe = create_generic_probe( nameStr, animPr );
|
|
seanhalle@208
|
193
|
|
seanhalle@208
|
194 hist = makeDblHistogram( numBins, startValue, binWidth );
|
|
seanhalle@208
|
195 newProbe->hist = hist;
|
|
seanhalle@208
|
196 return newProbe->probeID;
|
|
seanhalle@208
|
197 }
|
|
seanhalle@208
|
198
|
|
seanhalle@208
|
199 void
|
|
seanhalle@208
|
200 VMS_impl__index_probe_by_its_name( int32 probeID, SlaveVP *animPr )
|
|
seanhalle@208
|
201 { IntervalProbe *probe;
|
|
seanhalle@208
|
202
|
|
seanhalle@208
|
203 //TODO: fix this To be in Master -- race condition
|
|
seanhalle@208
|
204 probe = _VMSMasterEnv->intervalProbes[ probeID ];
|
|
seanhalle@208
|
205
|
|
seanhalle@208
|
206 addValueIntoTable(probe->nameStr, probe, _VMSMasterEnv->probeNameHashTbl);
|
|
seanhalle@208
|
207 }
|
|
seanhalle@208
|
208
|
|
seanhalle@208
|
209 IntervalProbe *
|
|
seanhalle@208
|
210 VMS_impl__get_probe_by_name( char *probeName, SlaveVP *animPr )
|
|
seanhalle@208
|
211 {
|
|
seanhalle@208
|
212 //TODO: fix this To be in Master -- race condition
|
|
seanhalle@208
|
213 return getValueFromTable( probeName, _VMSMasterEnv->probeNameHashTbl );
|
|
seanhalle@208
|
214 }
|
|
seanhalle@208
|
215
|
|
seanhalle@208
|
216
|
|
seanhalle@208
|
217 /*Everything is local to the animating procr, so no need for request, do
|
|
seanhalle@208
|
218 * work locally, in the anim Pr
|
|
seanhalle@208
|
219 */
|
|
seanhalle@208
|
220 void
|
|
seanhalle@208
|
221 VMS_impl__record_sched_choice_into_probe( int32 probeID, SlaveVP *animatingPr )
|
|
seanhalle@208
|
222 { IntervalProbe *probe;
|
|
seanhalle@208
|
223
|
|
seanhalle@208
|
224 probe = _VMSMasterEnv->intervalProbes[ probeID ];
|
|
seanhalle@208
|
225 probe->schedChoiceWasRecorded = TRUE;
|
|
seanhalle@208
|
226 probe->coreNum = animatingPr->coreAnimatedBy;
|
|
seanhalle@208
|
227 probe->procrID = animatingPr->procrID;
|
|
seanhalle@208
|
228 probe->procrCreateSecs = animatingPr->createPtInSecs;
|
|
seanhalle@208
|
229 }
|
|
seanhalle@208
|
230
|
|
seanhalle@208
|
231 /*Everything is local to the animating procr, so no need for request, do
|
|
seanhalle@208
|
232 * work locally, in the anim Pr
|
|
seanhalle@208
|
233 */
|
|
seanhalle@208
|
234 void
|
|
seanhalle@208
|
235 VMS_impl__record_interval_start_in_probe( int32 probeID )
|
|
seanhalle@208
|
236 { IntervalProbe *probe;
|
|
seanhalle@208
|
237
|
|
seanhalle@208
|
238 DEBUG( dbgProbes, "record start of interval\n" )
|
|
seanhalle@208
|
239 probe = _VMSMasterEnv->intervalProbes[ probeID ];
|
|
seanhalle@208
|
240 gettimeofday( &(probe->startStamp), NULL );
|
|
seanhalle@208
|
241 }
|
|
seanhalle@208
|
242
|
|
seanhalle@208
|
243
|
|
seanhalle@208
|
244 /*Everything is local to the animating procr, so no need for request, do
|
|
seanhalle@208
|
245 * work locally, in the anim Pr
|
|
seanhalle@208
|
246 */
|
|
seanhalle@208
|
247 void
|
|
seanhalle@208
|
248 VMS_impl__record_interval_end_in_probe( int32 probeID )
|
|
seanhalle@208
|
249 { IntervalProbe *probe;
|
|
seanhalle@208
|
250 struct timeval *endStamp, *startStamp;
|
|
seanhalle@208
|
251 float64 startSecs, endSecs;
|
|
seanhalle@208
|
252
|
|
seanhalle@208
|
253 DEBUG( dbgProbes, "record end of interval\n" )
|
|
seanhalle@208
|
254 //possible seg-fault if array resized by diff core right after this
|
|
seanhalle@208
|
255 // one gets probe..? Something like that? Might be safe.. don't care
|
|
seanhalle@208
|
256 probe = _VMSMasterEnv->intervalProbes[ probeID ];
|
|
seanhalle@208
|
257 gettimeofday( &(probe->endStamp), NULL);
|
|
seanhalle@208
|
258
|
|
seanhalle@208
|
259 //now turn into an interval held in a double
|
|
seanhalle@208
|
260 startStamp = &(probe->startStamp);
|
|
seanhalle@208
|
261 endStamp = &(probe->endStamp);
|
|
seanhalle@208
|
262
|
|
seanhalle@208
|
263 startSecs = startStamp->tv_sec + ( startStamp->tv_usec / 1000000.0 );
|
|
seanhalle@208
|
264 endSecs = endStamp->tv_sec + ( endStamp->tv_usec / 1000000.0 );
|
|
seanhalle@208
|
265
|
|
seanhalle@208
|
266 probe->interval = endSecs - startSecs;
|
|
seanhalle@208
|
267 probe->startSecs = startSecs;
|
|
seanhalle@208
|
268 probe->endSecs = endSecs;
|
|
seanhalle@208
|
269
|
|
seanhalle@208
|
270 if( probe->hist != NULL )
|
|
seanhalle@208
|
271 {
|
|
seanhalle@208
|
272 //if the interval is sane, then add to histogram
|
|
seanhalle@208
|
273 if( probe->interval < probe->hist->endOfRange * 10 )
|
|
seanhalle@208
|
274 addToDblHist( probe->interval, probe->hist );
|
|
seanhalle@208
|
275 }
|
|
seanhalle@208
|
276 }
|
|
seanhalle@208
|
277
|
|
seanhalle@208
|
278 void
|
|
seanhalle@208
|
279 print_probe_helper( IntervalProbe *probe )
|
|
seanhalle@208
|
280 {
|
|
seanhalle@208
|
281 printf( "\nprobe: %s, ", probe->nameStr );
|
|
seanhalle@208
|
282
|
|
seanhalle@208
|
283
|
|
seanhalle@208
|
284 if( probe->schedChoiceWasRecorded )
|
|
seanhalle@208
|
285 { printf( "coreNum: %d, procrID: %d, procrCreated: %0.6f | ",
|
|
seanhalle@208
|
286 probe->coreNum, probe->procrID, probe->procrCreateSecs );
|
|
seanhalle@208
|
287 }
|
|
seanhalle@208
|
288
|
|
seanhalle@208
|
289 if( probe->endSecs == 0 ) //just a single point in time
|
|
seanhalle@208
|
290 {
|
|
seanhalle@208
|
291 printf( " time point: %.6f\n",
|
|
seanhalle@208
|
292 probe->startSecs - _VMSMasterEnv->createPtInSecs );
|
|
seanhalle@208
|
293 }
|
|
seanhalle@208
|
294 else if( probe->hist == NULL ) //just an interval
|
|
seanhalle@208
|
295 {
|
|
seanhalle@208
|
296 printf( " startSecs: %.6f interval: %.6f\n",
|
|
seanhalle@208
|
297 (probe->startSecs - _VMSMasterEnv->createPtInSecs), probe->interval);
|
|
seanhalle@208
|
298 }
|
|
seanhalle@208
|
299 else //a full histogram of intervals
|
|
seanhalle@208
|
300 {
|
|
seanhalle@208
|
301 printDblHist( probe->hist );
|
|
seanhalle@208
|
302 }
|
|
seanhalle@208
|
303 }
|
|
seanhalle@208
|
304
|
|
seanhalle@208
|
305 //TODO: change so pass around pointer to probe instead of its array-index..
|
|
seanhalle@208
|
306 // will eliminate chance for timing of resize to cause problems with the
|
|
seanhalle@208
|
307 // lookup -- even though don't think it actually can cause problems..
|
|
seanhalle@208
|
308 // there's no need to pass index around -- have hash table for names, and
|
|
seanhalle@208
|
309 // only need it once, then have ptr to probe.. the thing about enum the
|
|
seanhalle@208
|
310 // index and use that as name is clunky in practice -- just hash.
|
|
seanhalle@208
|
311 void
|
|
seanhalle@208
|
312 VMS_impl__print_stats_of_probe( int32 probeID )
|
|
seanhalle@208
|
313 { IntervalProbe *probe;
|
|
seanhalle@208
|
314
|
|
seanhalle@208
|
315 probe = _VMSMasterEnv->intervalProbes[ probeID ];
|
|
seanhalle@208
|
316
|
|
seanhalle@208
|
317 print_probe_helper( probe );
|
|
seanhalle@208
|
318 }
|
|
seanhalle@208
|
319
|
|
seanhalle@208
|
320
|
|
seanhalle@208
|
321 inline void doNothing(){};
|
|
seanhalle@208
|
322
|
|
seanhalle@208
|
323 void
|
|
seanhalle@208
|
324 generic_print_probe( void *_probe )
|
|
seanhalle@208
|
325 {
|
|
seanhalle@208
|
326 IntervalProbe *probe = (IntervalProbe *)_probe;
|
|
seanhalle@208
|
327
|
|
seanhalle@208
|
328 //TODO segfault in printf
|
|
seanhalle@208
|
329 //print_probe_helper( probe );
|
|
seanhalle@208
|
330 }
|
|
seanhalle@208
|
331
|
|
seanhalle@208
|
332 void
|
|
seanhalle@208
|
333 VMS_impl__print_stats_of_all_probes()
|
|
seanhalle@208
|
334 {
|
|
seanhalle@208
|
335 forAllInDynArrayDo( _VMSMasterEnv->dynIntervalProbesInfo,
|
|
seanhalle@208
|
336 &generic_print_probe );
|
|
seanhalle@208
|
337 fflush( stdout );
|
|
seanhalle@208
|
338 }
|
|
seanhalle@208
|
339 #endif
|