| 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 /*
|
|
seanhalle@208
|
17 * In practice, probe operations are called from the app, from inside slaves
|
|
seanhalle@209
|
18 * -- so have to be sure each probe is single-Slv owned, and be sure that
|
|
seanhalle@208
|
19 * any place common structures are modified it's done inside the master.
|
|
seanhalle@208
|
20 * So -- the only place common structures are modified is during creation.
|
|
seanhalle@208
|
21 * after that, all mods are to individual instances.
|
|
seanhalle@208
|
22 *
|
|
seanhalle@208
|
23 * Thniking perhaps should change the semantics to be that probes are
|
|
seanhalle@208
|
24 * attached to the virtual processor -- and then everything is guaranteed
|
|
seanhalle@209
|
25 * to be isolated -- except then can't take any intervals that span Slvs,
|
|
seanhalle@209
|
26 * and would have to transfer the probes to Master env when Slv dissipates..
|
|
seanhalle@208
|
27 * gets messy..
|
|
seanhalle@208
|
28 *
|
|
seanhalle@208
|
29 * For now, just making so that probe creation causes a suspend, so that
|
|
seanhalle@208
|
30 * the dynamic array in the master env is only modified from the master
|
|
seanhalle@208
|
31 *
|
|
seanhalle@208
|
32 */
|
|
seanhalle@209
|
33
|
|
seanhalle@209
|
34 //============================ Helpers ===========================
|
|
seanhalle@209
|
35 inline void
|
|
seanhalle@209
|
36 doNothing()
|
|
seanhalle@209
|
37 {
|
|
seanhalle@209
|
38 }
|
|
seanhalle@209
|
39
|
|
seanhalle@209
|
40
|
|
seanhalle@208
|
41 IntervalProbe *
|
|
seanhalle@209
|
42 create_generic_probe( char *nameStr, SlaveVP *animSlv )
|
|
seanhalle@209
|
43 {
|
|
seanhalle@208
|
44 VMSSemReq reqData;
|
|
seanhalle@208
|
45
|
|
seanhalle@208
|
46 reqData.reqType = createProbe;
|
|
seanhalle@208
|
47 reqData.nameStr = nameStr;
|
|
seanhalle@208
|
48
|
|
seanhalle@209
|
49 VMS_WL__send_VMSSem_request( &reqData, animSlv );
|
|
seanhalle@208
|
50
|
|
seanhalle@209
|
51 return animSlv->dataRetFromReq;
|
|
seanhalle@208
|
52 }
|
|
seanhalle@208
|
53
|
|
seanhalle@208
|
54 /*Use this version from outside VMS -- it uses external malloc, and modifies
|
|
seanhalle@209
|
55 * dynamic array, so can't be animated in a slave Slv
|
|
seanhalle@208
|
56 */
|
|
seanhalle@208
|
57 IntervalProbe *
|
|
seanhalle@208
|
58 ext__create_generic_probe( char *nameStr )
|
|
seanhalle@208
|
59 { IntervalProbe *newProbe;
|
|
seanhalle@208
|
60 int32 nameLen;
|
|
seanhalle@208
|
61
|
|
seanhalle@208
|
62 newProbe = malloc( sizeof(IntervalProbe) );
|
|
seanhalle@208
|
63 nameLen = strlen( nameStr );
|
|
seanhalle@208
|
64 newProbe->nameStr = malloc( nameLen );
|
|
seanhalle@208
|
65 memcpy( newProbe->nameStr, nameStr, nameLen );
|
|
seanhalle@208
|
66 newProbe->hist = NULL;
|
|
seanhalle@208
|
67 newProbe->schedChoiceWasRecorded = FALSE;
|
|
seanhalle@208
|
68 newProbe->probeID =
|
|
seanhalle@208
|
69 addToDynArray( newProbe, _VMSMasterEnv->dynIntervalProbesInfo );
|
|
seanhalle@208
|
70
|
|
seanhalle@208
|
71 return newProbe;
|
|
seanhalle@208
|
72 }
|
|
seanhalle@208
|
73
|
|
seanhalle@209
|
74 //============================ Fns def in header =======================
|
|
seanhalle@208
|
75
|
|
seanhalle@209
|
76 int32
|
|
seanhalle@209
|
77 VMS_impl__create_single_interval_probe( char *nameStr, SlaveVP *animSlv )
|
|
seanhalle@209
|
78 { IntervalProbe *newProbe;
|
|
seanhalle@209
|
79
|
|
seanhalle@209
|
80 newProbe = create_generic_probe( nameStr, animSlv );
|
|
seanhalle@209
|
81
|
|
seanhalle@209
|
82 return newProbe->probeID;
|
|
seanhalle@208
|
83 }
|
|
seanhalle@208
|
84
|
|
seanhalle@209
|
85 int32
|
|
seanhalle@209
|
86 VMS_impl__create_histogram_probe( int32 numBins, float64 startValue,
|
|
seanhalle@209
|
87 float64 binWidth, char *nameStr, SlaveVP *animSlv )
|
|
seanhalle@209
|
88 { IntervalProbe *newProbe;
|
|
seanhalle@209
|
89 DblHist *hist;
|
|
seanhalle@209
|
90
|
|
seanhalle@209
|
91 newProbe = create_generic_probe( nameStr, animSlv );
|
|
seanhalle@209
|
92
|
|
seanhalle@209
|
93 hist = makeDblHistogram( numBins, startValue, binWidth );
|
|
seanhalle@209
|
94 newProbe->hist = hist;
|
|
seanhalle@209
|
95 return newProbe->probeID;
|
|
seanhalle@209
|
96 }
|
|
seanhalle@209
|
97
|
|
seanhalle@208
|
98
|
|
seanhalle@208
|
99 int32
|
|
seanhalle@209
|
100 VMS_impl__record_time_point_into_new_probe( char *nameStr, SlaveVP *animSlv)
|
|
seanhalle@208
|
101 { IntervalProbe *newProbe;
|
|
seanhalle@208
|
102 struct timeval *startStamp;
|
|
seanhalle@208
|
103 float64 startSecs;
|
|
seanhalle@208
|
104
|
|
seanhalle@209
|
105 newProbe = create_generic_probe( nameStr, animSlv );
|
|
seanhalle@208
|
106 newProbe->endSecs = 0;
|
|
seanhalle@208
|
107
|
|
seanhalle@208
|
108 gettimeofday( &(newProbe->startStamp), NULL);
|
|
seanhalle@208
|
109
|
|
seanhalle@208
|
110 //turn into a double
|
|
seanhalle@208
|
111 startStamp = &(newProbe->startStamp);
|
|
seanhalle@208
|
112 startSecs = startStamp->tv_sec + ( startStamp->tv_usec / 1000000.0 );
|
|
seanhalle@208
|
113 newProbe->startSecs = startSecs;
|
|
seanhalle@208
|
114
|
|
seanhalle@208
|
115 return newProbe->probeID;
|
|
seanhalle@208
|
116 }
|
|
seanhalle@208
|
117
|
|
seanhalle@208
|
118 int32
|
|
seanhalle@208
|
119 VMS_ext_impl__record_time_point_into_new_probe( char *nameStr )
|
|
seanhalle@208
|
120 { IntervalProbe *newProbe;
|
|
seanhalle@208
|
121 struct timeval *startStamp;
|
|
seanhalle@208
|
122 float64 startSecs;
|
|
seanhalle@208
|
123
|
|
seanhalle@208
|
124 newProbe = ext__create_generic_probe( nameStr );
|
|
seanhalle@208
|
125 newProbe->endSecs = 0;
|
|
seanhalle@208
|
126
|
|
seanhalle@208
|
127 gettimeofday( &(newProbe->startStamp), NULL);
|
|
seanhalle@208
|
128
|
|
seanhalle@208
|
129 //turn into a double
|
|
seanhalle@208
|
130 startStamp = &(newProbe->startStamp);
|
|
seanhalle@208
|
131 startSecs = startStamp->tv_sec + ( startStamp->tv_usec / 1000000.0 );
|
|
seanhalle@208
|
132 newProbe->startSecs = startSecs;
|
|
seanhalle@208
|
133
|
|
seanhalle@208
|
134 return newProbe->probeID;
|
|
seanhalle@208
|
135 }
|
|
seanhalle@208
|
136
|
|
seanhalle@208
|
137
|
|
seanhalle@209
|
138 /*Only call from inside master or main startup/shutdown thread
|
|
seanhalle@209
|
139 */
|
|
seanhalle@209
|
140 void
|
|
seanhalle@209
|
141 VMS_impl__free_probe( IntervalProbe *probe )
|
|
seanhalle@209
|
142 { if( probe->hist != NULL ) freeDblHist( probe->hist );
|
|
seanhalle@209
|
143 if( probe->nameStr != NULL) VMS_int__free( probe->nameStr );
|
|
seanhalle@209
|
144 VMS_int__free( probe );
|
|
seanhalle@208
|
145 }
|
|
seanhalle@208
|
146
|
|
seanhalle@208
|
147
|
|
seanhalle@208
|
148 void
|
|
seanhalle@209
|
149 VMS_impl__index_probe_by_its_name( int32 probeID, SlaveVP *animSlv )
|
|
seanhalle@208
|
150 { IntervalProbe *probe;
|
|
seanhalle@208
|
151
|
|
seanhalle@208
|
152 //TODO: fix this To be in Master -- race condition
|
|
seanhalle@208
|
153 probe = _VMSMasterEnv->intervalProbes[ probeID ];
|
|
seanhalle@208
|
154
|
|
seanhalle@208
|
155 addValueIntoTable(probe->nameStr, probe, _VMSMasterEnv->probeNameHashTbl);
|
|
seanhalle@208
|
156 }
|
|
seanhalle@208
|
157
|
|
seanhalle@209
|
158
|
|
seanhalle@208
|
159 IntervalProbe *
|
|
seanhalle@209
|
160 VMS_impl__get_probe_by_name( char *probeName, SlaveVP *animSlv )
|
|
seanhalle@208
|
161 {
|
|
seanhalle@208
|
162 //TODO: fix this To be in Master -- race condition
|
|
seanhalle@208
|
163 return getValueFromTable( probeName, _VMSMasterEnv->probeNameHashTbl );
|
|
seanhalle@208
|
164 }
|
|
seanhalle@208
|
165
|
|
seanhalle@208
|
166
|
|
seanhalle@208
|
167 /*Everything is local to the animating procr, so no need for request, do
|
|
seanhalle@209
|
168 * work locally, in the anim Slv
|
|
seanhalle@208
|
169 */
|
|
seanhalle@208
|
170 void
|
|
seanhalle@209
|
171 VMS_impl__record_sched_choice_into_probe( int32 probeID, SlaveVP *animatingSlv )
|
|
seanhalle@208
|
172 { IntervalProbe *probe;
|
|
seanhalle@208
|
173
|
|
seanhalle@208
|
174 probe = _VMSMasterEnv->intervalProbes[ probeID ];
|
|
seanhalle@208
|
175 probe->schedChoiceWasRecorded = TRUE;
|
|
seanhalle@209
|
176 probe->coreNum = animatingSlv->coreAnimatedBy;
|
|
seanhalle@209
|
177 probe->slaveID = animatingSlv->procrID;
|
|
seanhalle@209
|
178 probe->slaveCreateSecs = animatingSlv->createPtInSecs;
|
|
seanhalle@208
|
179 }
|
|
seanhalle@208
|
180
|
|
seanhalle@208
|
181 /*Everything is local to the animating procr, so no need for request, do
|
|
seanhalle@209
|
182 * work locally, in the anim Slv
|
|
seanhalle@208
|
183 */
|
|
seanhalle@208
|
184 void
|
|
seanhalle@208
|
185 VMS_impl__record_interval_start_in_probe( int32 probeID )
|
|
seanhalle@208
|
186 { IntervalProbe *probe;
|
|
seanhalle@208
|
187
|
|
seanhalle@208
|
188 DEBUG( dbgProbes, "record start of interval\n" )
|
|
seanhalle@208
|
189 probe = _VMSMasterEnv->intervalProbes[ probeID ];
|
|
seanhalle@209
|
190 probe->startStamp = getTSCount();
|
|
seanhalle@208
|
191 }
|
|
seanhalle@208
|
192
|
|
seanhalle@208
|
193
|
|
seanhalle@208
|
194 /*Everything is local to the animating procr, so no need for request, do
|
|
seanhalle@209
|
195 * work locally, in the anim Slv
|
|
seanhalle@209
|
196 *
|
|
seanhalle@209
|
197 *This should be safe to run inside SlaveVP -- weird behavior will be due
|
|
seanhalle@209
|
198 * to the logical error of having more than one interval open in overlapped.
|
|
seanhalle@208
|
199 */
|
|
seanhalle@208
|
200 void
|
|
seanhalle@208
|
201 VMS_impl__record_interval_end_in_probe( int32 probeID )
|
|
seanhalle@208
|
202 { IntervalProbe *probe;
|
|
seanhalle@209
|
203 TSCount endStamp;
|
|
seanhalle@208
|
204
|
|
seanhalle@209
|
205 endStamp = getTSCount();
|
|
seanhalle@209
|
206
|
|
seanhalle@208
|
207 DEBUG( dbgProbes, "record end of interval\n" )
|
|
seanhalle@209
|
208
|
|
seanhalle@208
|
209 probe = _VMSMasterEnv->intervalProbes[ probeID ];
|
|
seanhalle@209
|
210 probe->endStamp = endStamp;
|
|
seanhalle@208
|
211
|
|
seanhalle@208
|
212 if( probe->hist != NULL )
|
|
seanhalle@209
|
213 { TSCount interval = probe->endStamp - probe->startStamp;
|
|
seanhalle@208
|
214 //if the interval is sane, then add to histogram
|
|
seanhalle@209
|
215 if( interval < probe->hist->endOfRange * 10 )
|
|
seanhalle@209
|
216 addToFloatHist( interval, probe->hist );
|
|
seanhalle@208
|
217 }
|
|
seanhalle@208
|
218 }
|
|
seanhalle@208
|
219
|
|
seanhalle@209
|
220
|
|
seanhalle@208
|
221 void
|
|
seanhalle@208
|
222 print_probe_helper( IntervalProbe *probe )
|
|
seanhalle@208
|
223 {
|
|
seanhalle@208
|
224 printf( "\nprobe: %s, ", probe->nameStr );
|
|
seanhalle@208
|
225
|
|
seanhalle@208
|
226
|
|
seanhalle@208
|
227 if( probe->schedChoiceWasRecorded )
|
|
seanhalle@208
|
228 { printf( "coreNum: %d, procrID: %d, procrCreated: %0.6f | ",
|
|
seanhalle@209
|
229 probe->coreNum, probe->slaveID, probe->slaveCreateSecs );
|
|
seanhalle@208
|
230 }
|
|
seanhalle@208
|
231
|
|
seanhalle@208
|
232 if( probe->endSecs == 0 ) //just a single point in time
|
|
seanhalle@208
|
233 {
|
|
seanhalle@208
|
234 printf( " time point: %.6f\n",
|
|
seanhalle@208
|
235 probe->startSecs - _VMSMasterEnv->createPtInSecs );
|
|
seanhalle@208
|
236 }
|
|
seanhalle@208
|
237 else if( probe->hist == NULL ) //just an interval
|
|
seanhalle@208
|
238 {
|
|
seanhalle@208
|
239 printf( " startSecs: %.6f interval: %.6f\n",
|
|
seanhalle@208
|
240 (probe->startSecs - _VMSMasterEnv->createPtInSecs), probe->interval);
|
|
seanhalle@208
|
241 }
|
|
seanhalle@208
|
242 else //a full histogram of intervals
|
|
seanhalle@208
|
243 {
|
|
seanhalle@208
|
244 printDblHist( probe->hist );
|
|
seanhalle@208
|
245 }
|
|
seanhalle@208
|
246 }
|
|
seanhalle@208
|
247
|
|
seanhalle@208
|
248 //TODO: change so pass around pointer to probe instead of its array-index..
|
|
seanhalle@208
|
249 // will eliminate chance for timing of resize to cause problems with the
|
|
seanhalle@208
|
250 // lookup -- even though don't think it actually can cause problems..
|
|
seanhalle@208
|
251 // there's no need to pass index around -- have hash table for names, and
|
|
seanhalle@208
|
252 // only need it once, then have ptr to probe.. the thing about enum the
|
|
seanhalle@208
|
253 // index and use that as name is clunky in practice -- just hash.
|
|
seanhalle@208
|
254 void
|
|
seanhalle@208
|
255 VMS_impl__print_stats_of_probe( int32 probeID )
|
|
seanhalle@208
|
256 { IntervalProbe *probe;
|
|
seanhalle@208
|
257
|
|
seanhalle@208
|
258 probe = _VMSMasterEnv->intervalProbes[ probeID ];
|
|
seanhalle@208
|
259
|
|
seanhalle@208
|
260 print_probe_helper( probe );
|
|
seanhalle@208
|
261 }
|
|
seanhalle@208
|
262
|
|
seanhalle@208
|
263
|
|
seanhalle@208
|
264 void
|
|
seanhalle@208
|
265 VMS_impl__print_stats_of_all_probes()
|
|
seanhalle@208
|
266 {
|
|
seanhalle@208
|
267 forAllInDynArrayDo( _VMSMasterEnv->dynIntervalProbesInfo,
|
|
seanhalle@209
|
268 &VMS_impl__print_stats_of_probe );
|
|
seanhalle@208
|
269 fflush( stdout );
|
|
seanhalle@208
|
270 }
|