annotate probes.c @ 208:eaf7e4c58c9e

Create common_ancestor brch -- all branches will be closed, then new ones created with this as the common ancestor of all branches -- it is incomplete! only code that is common to all HW and Feat and FeatDev branches is in here
author Some Random Person <seanhalle@yahoo.com>
date Wed, 22 Feb 2012 11:39:12 -0800
parents
children 0c83ea8adefc
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