annotate probes.c @ 209:0c83ea8adefc

Close to compilable version of common_ancestor -- still includes HW dep stuff
author Some Random Person <seanhalle@yahoo.com>
date Sun, 04 Mar 2012 14:26:35 -0800
parents eaf7e4c58c9e
children
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 }