msach@94: /* msach@94: * Copyright 2009 OpenSourceStewardshipFoundation.org msach@94: * Licensed under GNU General Public License version 2 msach@94: * msach@94: * Author: seanhalle@yahoo.com msach@94: * msach@94: */ msach@94: msach@94: #ifndef _VMS_H msach@94: #define _VMS_H msach@94: #define _GNU_SOURCE msach@94: msach@94: #include "VMS_primitive_data_types.h" msach@94: #include "Queue_impl/PrivateQueue.h" msach@94: #include "Histogram/Histogram.h" msach@94: #include "DynArray/DynArray.h" msach@94: #include "Hash_impl/PrivateHash.h" msach@94: #include "vmalloc.h" engelhardt@108: #include "Counters/Counters.h" Nina@166: #include "loop.h" nengel@177: #include "ListOfArrays/ListOfArrays.h" msach@94: msach@94: #include msach@94: #include msach@94: msach@94: msach@94: //=============================== Debug =================================== msach@94: // msach@94: //When SEQUENTIAL is defined, VMS does sequential exe in the main thread msach@94: // It still does co-routines and all the mechanisms are the same, it just msach@94: // has only a single thread and animates VPs one at a time msach@94: //#define SEQUENTIAL msach@94: msach@94: //#define USE_WORK_STEALING msach@94: msach@94: //turns on the probe-instrumentation in the application -- when not msach@94: // defined, the calls to the probe functions turn into comments Nina@110: //#define STATS__ENABLE_PROBES msach@94: //#define TURN_ON_DEBUG_PROBES msach@94: msach@94: //These defines turn types of bug messages on and off msach@94: // be sure debug messages are un-commented (next block of defines) Nina@129: #define dbgAppFlow FALSE /* Top level flow of application code -- general*/ msach@94: #define dbgProbes FALSE /* for issues inside probes themselves*/ msach@94: #define dbgB2BMaster FALSE /* in coreloop, back to back master VPs*/ Nina@129: #define dbgRqstHdlr FALSE /* in request handler code*/ Nina@129: #define dbgDependency TRUE /* in request handler code, print dependencies */ msach@94: msach@94: //Comment or un- the substitute half to turn on/off types of debug message msach@94: #define DEBUG( bool, msg) \ Nina@109: if( bool){ printf(msg); fflush(stdin);} msach@94: #define DEBUG1( bool, msg, param) \ Nina@109: if(bool){printf(msg, param); fflush(stdin);} msach@94: #define DEBUG2( bool, msg, p1, p2) \ Nina@109: if(bool) {printf(msg, p1, p2); fflush(stdin);} msach@94: msach@94: #define ERROR(msg) printf(msg); msach@94: #define ERROR1(msg, param) printf(msg, param); msach@94: #define ERROR2(msg, p1, p2) printf(msg, p1, p2); msach@94: msach@94: //=========================== STATS ======================= msach@94: msach@94: //when MEAS__TIME_STAMP_SUSP is defined, causes code to be inserted and msach@94: // compiled-in that saves the low part of the time stamp count just before engelhardt@108: // suspending a processor and just after resuming that processor. It is msach@94: // saved into a field added to VirtProcr. Have to sanity-check for msach@94: // rollover of low portion into high portion. msach@94: //#define MEAS__TIME_STAMP_SUSP msach@94: //#define MEAS__TIME_MASTER Nina@109: //#define MEAS__TIME_PLUGIN Nina@109: //#define MEAS__TIME_MALLOC msach@94: //#define MEAS__TIME_MASTER_LOCK Nina@109: //#define MEAS__NUM_TIMES_TO_RUN 100000 msach@94: msach@94: //For code that calculates normalization-offset between TSC counts of msach@94: // different cores. Nina@109: //#define NUM_TSC_ROUND_TRIPS 10 msach@94: engelhardt@108: #define MEAS__PERF_COUNTERS Nina@167: #define OBSERVE_UCC Nina@166: #define DETECT_LOOP_GRAPH msach@94: msach@94: //========================= Hardware related Constants ===================== msach@94: //This value is the number of hardware threads in the shared memory msach@94: // machine engelhardt@108: #define NUM_CORES 2 msach@94: msach@94: // tradeoff amortizing master fixed overhead vs imbalance potential msach@94: // when work-stealing, can make bigger, at risk of losing cache affinity msach@94: #define NUM_SCHED_SLOTS 5 msach@94: msach@94: #define MIN_WORK_UNIT_CYCLES 20000 msach@94: msach@94: #define MASTERLOCK_RETRIES 10000 msach@94: msach@94: // stack size in virtual processors created msach@94: #define VIRT_PROCR_STACK_SIZE 0x8000 /* 32K */ msach@94: msach@94: // memory for VMS__malloc msach@94: #define MALLOC_ADDITIONAL_MEM_FROM_OS_SIZE 0x10000000 /* 256M */ msach@94: msach@94: #define CACHE_LINE 64 msach@94: #define PAGE_SIZE 4096 msach@94: msach@94: msach@94: //============================== msach@94: msach@94: #define SUCCESS 0 msach@94: msach@94: #define writeVMSQ writePrivQ msach@94: #define readVMSQ readPrivQ msach@94: #define makeVMSQ makeVMSPrivQ msach@94: #define numInVMSQ numInPrivQ msach@94: #define VMSQueueStruc PrivQueueStruc msach@94: msach@94: msach@94: msach@94: //=========================================================================== msach@94: typedef unsigned long long TSCount; msach@94: msach@94: typedef struct _SchedSlot SchedSlot; msach@94: typedef struct _VMSReqst VMSReqst; msach@94: typedef struct _VirtProcr VirtProcr; msach@94: typedef struct _IntervalProbe IntervalProbe; msach@94: typedef struct _GateStruc GateStruc; msach@94: msach@94: nengel@177: typedef VirtProcr * (*SlaveScheduler) ( void *, int, int ); //semEnv, coreIdx msach@94: typedef void (*RequestHandler) ( VirtProcr *, void * ); //prWReqst, semEnv msach@94: typedef void (*VirtProcrFnPtr) ( void *, VirtProcr * ); //initData, animPr msach@94: typedef void VirtProcrFn ( void *, VirtProcr * ); //initData, animPr msach@94: typedef void (*ResumePrFnPtr) ( VirtProcr *, void * ); msach@94: msach@94: msach@94: //============= Requests =========== msach@94: // msach@94: msach@94: enum VMSReqstType //avoid starting enums at 0, for debug reasons msach@94: { msach@94: semantic = 1, msach@94: createReq, msach@94: dissipate, msach@94: VMSSemantic //goes with VMSSemReqst below msach@94: }; msach@94: msach@94: struct _VMSReqst msach@94: { msach@94: enum VMSReqstType reqType;//used for dissipate and in future for IO requests msach@94: void *semReqData; msach@94: msach@94: VMSReqst *nextReqst; msach@94: }; msach@94: //VMSReqst msach@94: msach@94: enum VMSSemReqstType //These are equivalent to semantic requests, but for msach@94: { // VMS's services available directly to app, like OS msach@94: createProbe = 1, // and probe services -- like a VMS-wide built-in lang msach@94: openFile, msach@94: otherIO msach@94: }; msach@94: msach@94: typedef struct msach@94: { enum VMSSemReqstType reqType; msach@94: VirtProcr *requestingPr; msach@94: char *nameStr; //for create probe msach@94: } msach@94: VMSSemReq; msach@94: msach@94: msach@94: //==================== Core data structures =================== msach@94: msach@94: struct _SchedSlot msach@94: { msach@94: int workIsDone; msach@94: int needsProcrAssigned; msach@94: VirtProcr *procrAssignedToSlot; msach@94: }; msach@94: //SchedSlot msach@94: msach@94: /*WARNING: re-arranging this data structure could cause VP switching msach@94: * assembly code to fail -- hard-codes offsets of fields msach@94: */ msach@94: struct _VirtProcr msach@94: { int procrID; //for debugging -- count up each time create msach@94: int coreAnimatedBy; msach@94: void *startOfStack; msach@94: void *stackPtr; msach@94: void *framePtr; msach@94: void *nextInstrPt; msach@94: msach@94: void *coreLoopStartPt; //allows proto-runtime to be linked later msach@94: void *coreLoopFramePtr; //restore before jmp back to core loop msach@94: void *coreLoopStackPtr; //restore before jmp back to core loop msach@94: msach@94: void *initialData; msach@94: msach@94: SchedSlot *schedSlot; msach@94: VMSReqst *requests; msach@94: msach@94: void *semanticData; //this livesUSE_GNU here for the life of VP msach@94: void *dataRetFromReq;//values returned from plugin to VP go here msach@94: msach@94: //=========== MEASUREMENT STUFF ========== msach@94: #ifdef MEAS__TIME_STAMP_SUSP msach@94: unsigned int preSuspTSCLow; msach@94: unsigned int postSuspTSCLow; msach@94: #endif msach@94: #ifdef MEAS__TIME_MASTER /* in VirtProcr because multiple masterVPs*/ msach@94: unsigned int startMasterTSCLow;USE_GNU msach@94: unsigned int endMasterTSCLow; msach@94: #endif engelhardt@108: #ifdef MEAS__PERF_COUNTERS // engelhardt@108: CounterRecord** counter_history; engelhardt@108: PrivDynArrayInfo* counter_history_array_info; engelhardt@108: #endif msach@94: //======================================== msach@94: msach@94: float64 createPtInSecs; //have space but don't use on some configs Nina@167: int numTimesScheduled; //defines units together w/ procrID msach@94: }; msach@94: //VirtProcr msach@94: msach@94: msach@94: /*WARNING: re-arranging this data structure could cause VP-switching msach@94: * assembly code to fail -- hard-codes offsets of fields msach@94: * (because -O3 messes with things otherwise) msach@94: */ msach@94: typedef struct msach@94: { msach@94: SlaveScheduler slaveScheduler; msach@94: RequestHandler requestHandler; msach@94: msach@94: SchedSlot ***allSchedSlots; msach@94: VMSQueueStruc **readyToAnimateQs; msach@94: VirtProcr **masterVPs; msach@94: msach@94: void *semanticEnv; msach@94: void *OSEventStruc; //for future, when add I/O to BLIS msach@94: MallocProlog *freeListHead; msach@94: int32 amtOfOutstandingMem; //total currently allocated msach@94: msach@94: void *coreLoopReturnPt;//addr to jump to to re-enter coreLoop msach@94: msach@94: int32 setupComplete; msach@94: volatile int32 masterLock; msach@94: msach@94: int32 numMasterInARow[NUM_CORES];//detect back-to-back masterVP msach@94: GateStruc *workStealingGates[ NUM_CORES ]; //concurrent work-steal msach@94: int32 workStealingLock; msach@94: msach@94: int32 numProcrsCreated; //gives ordering to processor creation msach@94: msach@94: //=========== MEASUREMENT STUFF ============= msach@94: IntervalProbe **intervalProbes; msach@94: PrivDynArrayInfo *dynIntervalProbesInfo; msach@94: HashTable *probeNameHashTbl; msach@94: int32 masterCreateProbeID; msach@94: float64 createPtInSecs; msach@94: Histogram **measHists; msach@94: PrivDynArrayInfo *measHistsInfo; msach@94: #ifdef MEAS__TIME_PLUGIN msach@94: Histogram *reqHdlrLowTimeHist; msach@94: Histogram *reqHdlrHighTimeHist; msach@94: #endif msach@94: #ifdef MEAS__TIME_MALLOC msach@94: Histogram *mallocTimeHist; msach@94: Histogram *freeTimeHist; msach@94: #endif msach@94: #ifdef MEAS__TIME_MASTER_LOCK msach@94: Histogram *masterLockLowTimeHist; msach@94: Histogram *masterLockHighTimeHist; msach@94: #endif engelhardt@108: #ifdef MEAS__PERF_COUNTERS engelhardt@108: int cycles_counter_fd[NUM_CORES]; engelhardt@108: int instrs_counter_fd[NUM_CORES]; Nina@110: FILE* counteroutput; engelhardt@108: #endif Nina@131: #ifdef MEAS__PERF_COUNTERS // Nina@131: CounterRecord** counter_history; Nina@131: PrivDynArrayInfo* counter_history_array_info; Nina@131: #endif msach@94: } msach@94: MasterEnv; msach@94: msach@94: //========================= Extra Stuff Data Strucs ======================= msach@94: typedef struct msach@94: { msach@94: msach@94: } msach@94: VMSExcp; msach@94: msach@94: struct _GateStruc msach@94: { msach@94: int32 gateClosed; msach@94: int32 preGateProgress; msach@94: int32 waitProgress; msach@94: int32 exitProgress; msach@94: }; msach@94: //GateStruc msach@94: msach@94: //======================= OS Thread related =============================== msach@94: msach@94: void * coreLoop( void *paramsIn ); //standard PThreads fn prototype msach@94: void * coreLoop_Seq( void *paramsIn ); //standard PThreads fn prototype msach@94: void masterLoop( void *initData, VirtProcr *masterPr ); msach@94: msach@94: msach@94: typedef struct msach@94: { msach@94: void *endThdPt; msach@94: unsigned int coreNum; msach@94: } msach@94: ThdParams; msach@94: msach@94: pthread_t coreLoopThdHandles[ NUM_CORES ]; //pthread's virt-procr state msach@94: ThdParams *coreLoopThdParams [ NUM_CORES ]; msach@94: pthread_mutex_t suspendLock; msach@94: pthread_cond_t suspend_cond; msach@94: msach@94: msach@94: msach@94: //===================== Global Vars =================== msach@94: msach@94: volatile MasterEnv *_VMSMasterEnv; msach@94: msach@94: msach@94: msach@94: msach@94: //=========================== Function Prototypes ========================= msach@94: msach@94: msach@94: //========== Setup and shutdown ========== msach@94: void msach@94: VMS__init(); msach@94: msach@94: void msach@94: VMS__init_Seq(); msach@94: msach@94: void msach@94: VMS__start_the_work_then_wait_until_done(); msach@94: msach@94: void msach@94: VMS__start_the_work_then_wait_until_done_Seq(); msach@94: msach@94: inline VirtProcr * msach@94: VMS__create_procr( VirtProcrFnPtr fnPtr, void *initialData ); msach@94: msach@94: void msach@94: VMS__dissipate_procr( VirtProcr *procrToDissipate ); msach@94: msach@94: //Use this to create processor inside entry point & other places outside msach@94: // the VMS system boundary (IE, not run in slave nor Master) msach@94: VirtProcr * msach@94: VMS_ext__create_procr( VirtProcrFnPtr fnPtr, void *initialData ); msach@94: msach@94: void msach@94: VMS_ext__dissipate_procr( VirtProcr *procrToDissipate ); msach@94: msach@94: void msach@94: VMS__throw_exception( char *msgStr, VirtProcr *reqstPr, VMSExcp *excpData ); msach@94: msach@94: void msach@94: VMS__shutdown(); msach@94: msach@94: void msach@94: VMS__cleanup_at_end_of_shutdown(); msach@94: msach@94: void * msach@94: VMS__give_sem_env_for( VirtProcr *animPr ); msach@94: msach@94: msach@94: //============== Request Related =============== msach@94: msach@94: void msach@94: VMS__suspend_procr( VirtProcr *callingPr ); msach@94: msach@94: inline void msach@94: VMS__add_sem_request_in_mallocd_VMSReqst( void *semReqData, VirtProcr *callingPr ); msach@94: nengel@182: inline void msach@94: VMS__send_sem_request( void *semReqData, VirtProcr *callingPr ); msach@94: msach@94: void msach@94: VMS__send_create_procr_req( void *semReqData, VirtProcr *reqstingPr ); msach@94: nengel@182: void inline msach@94: VMS__send_dissipate_req( VirtProcr *prToDissipate ); msach@94: nengel@182: inline void msach@94: VMS__send_VMSSem_request( void *semReqData, VirtProcr *callingPr ); msach@94: msach@94: VMSReqst * msach@94: VMS__take_next_request_out_of( VirtProcr *procrWithReq ); msach@94: msach@94: inline void * msach@94: VMS__take_sem_reqst_from( VMSReqst *req ); msach@94: msach@94: void inline msach@94: VMS__handle_VMSSemReq( VMSReqst *req, VirtProcr *requestingPr, void *semEnv, msach@94: ResumePrFnPtr resumePrFnPtr ); msach@94: msach@94: //======================== STATS ====================== msach@94: msach@94: //===== RDTSC wrapper ===== //Also runs with x86_64 code msach@94: msach@94: #define saveTimeStampCountInto(low, high) \ msach@94: asm volatile("RDTSC; \ msach@94: movl %%eax, %0; \ msach@94: movl %%edx, %1;" \ msach@94: /* outputs */ : "=m" (low), "=m" (high)\ msach@94: /* inputs */ : \ msach@94: /* clobber */ : "%eax", "%edx" \ msach@94: ); msach@94: msach@94: #define saveLowTimeStampCountInto(low) \ msach@94: asm volatile("RDTSC; \ msach@94: movl %%eax, %0;" \ msach@94: /* outputs */ : "=m" (low) \ msach@94: /* inputs */ : \ msach@94: /* clobber */ : "%eax", "%edx" \ msach@94: ); msach@94: msach@94: //==================== msach@94: #define makeAMeasHist( idx, name, numBins, startVal, binWidth ) \ msach@94: makeHighestDynArrayIndexBeAtLeast( _VMSMasterEnv->measHistsInfo, idx ); \ msach@94: _VMSMasterEnv->measHists[idx] = \ msach@94: makeFixedBinHist( numBins, startVal, binWidth, name ); msach@94: Nina@109: #define saveCyclesAndInstrs(core,cycles,instrs) do{ \ Nina@109: int cycles_fd = _VMSMasterEnv->cycles_counter_fd[core]; \ Nina@109: int instrs_fd = _VMSMasterEnv->instrs_counter_fd[core]; \ Nina@109: int nread; \ Nina@109: \ Nina@109: nread = read(cycles_fd,&(cycles),sizeof(cycles)); \ Nina@109: if(nread<0){ \ Nina@109: perror("Error reading cycles counter"); \ Nina@109: cycles = 0; \ Nina@109: } \ Nina@109: \ Nina@109: nread = read(instrs_fd,&(instrs),sizeof(instrs)); \ Nina@109: if(nread<0){ \ Nina@109: perror("Error reading cycles counter"); \ Nina@109: instrs = 0; \ Nina@109: } \ Nina@109: } while (0) Nina@109: Nina@111: #define getReturnAddressBeforeLibraryCall(vp_ptr, res_ptr) do{ \ Nina@111: void* frame_ptr0 = vp_ptr->framePtr; \ Nina@110: void* frame_ptr1 = *((void**)frame_ptr0); \ Nina@110: void* frame_ptr2 = *((void**)frame_ptr1); \ Nina@110: void* frame_ptr3 = *((void**)frame_ptr2); \ Nina@111: void* ret_addr = *((void**)frame_ptr3 + 1); \ Nina@111: *res_ptr = ret_addr; \ Nina@110: } while (0) msach@94: msach@94: #define MEAS__SUB_CREATE /*turn on/off subtraction of create from plugin*/ msach@94: msach@94: #ifdef VPTHREAD msach@94: msach@94: //VPThread nengel@182: #define createHistIdx 0 nengel@182: #define mutexLockHistIdx 1 nengel@182: #define mutexUnlockHistIdx 2 nengel@182: #define condWaitHistIdx 3 nengel@182: #define condSignalHistIdx 4 msach@94: msach@94: #define MakeTheMeasHists() \ msach@94: _VMSMasterEnv->measHistsInfo = \ msach@94: makePrivDynArrayOfSize( (void***)&(_VMSMasterEnv->measHists), 200); \ msach@94: makeAMeasHist( createHistIdx, "create", 250, 0, 100 ) \ msach@94: makeAMeasHist( mutexLockHistIdx, "mutex_lock", 50, 0, 100 ) \ msach@94: makeAMeasHist( mutexUnlockHistIdx, "mutex_unlock", 50, 0, 100 ) \ msach@94: makeAMeasHist( condWaitHistIdx, "cond_wait", 50, 0, 100 ) \ msach@94: makeAMeasHist( condSignalHistIdx, "cond_signal", 50, 0, 100 ) msach@94: msach@94: #endif msach@94: msach@94: msach@94: #ifdef VCILK msach@94: msach@94: //VCilk nengel@182: #define spawnHistIdx 0 nengel@182: #define syncHistIdx 1 msach@94: msach@94: #define MakeTheMeasHists() \ msach@94: _VMSMasterEnv->measHistsInfo = \ msach@94: makePrivDynArrayOfSize( (void***)&(_VMSMasterEnv->measHists), 200); \ msach@94: makeAMeasHist( spawnHistIdx, "Spawn", 50, 0, 200 ) \ msach@94: makeAMeasHist( syncHistIdx, "Sync", 50, 0, 200 ) msach@94: msach@94: msach@94: #endif msach@94: msach@94: #ifdef SSR msach@94: msach@94: //SSR nengel@182: #define SendFromToHistIdx 0 nengel@182: #define SendOfTypeHistIdx 1 nengel@182: #define ReceiveFromToHistIdx 2 nengel@182: #define ReceiveOfTypeHistIdx 3 msach@94: msach@94: #define MakeTheMeasHists() \ msach@94: _VMSMasterEnv->measHistsInfo = \ msach@94: makePrivDynArrayOfSize( (void***)&(_VMSMasterEnv->measHists), 200); \ msach@94: makeAMeasHist( SendFromToHistIdx, "SendFromTo", 50, 0, 100 ) \ msach@94: makeAMeasHist( SendOfTypeHistIdx, "SendOfType", 50, 0, 100 ) \ msach@94: makeAMeasHist( ReceiveFromToHistIdx,"ReceiveFromTo", 50, 0, 100 ) \ msach@94: makeAMeasHist( ReceiveOfTypeHistIdx,"ReceiveOfType", 50, 0, 100 ) msach@94: msach@94: #endif msach@94: msach@94: //=========================================================================== msach@94: //VPThread msach@94: msach@94: msach@94: #define Meas_startCreate \ msach@94: int32 startStamp, endStamp; \ msach@94: saveLowTimeStampCountInto( startStamp ); \ msach@94: msach@94: #define Meas_endCreate \ msach@94: saveLowTimeStampCountInto( endStamp ); \ msach@94: addIntervalToHist( startStamp, endStamp, \ msach@94: _VMSMasterEnv->measHists[ createHistIdx ] ); msach@94: msach@94: #define Meas_startMutexLock \ msach@94: int32 startStamp, endStamp; \ msach@94: saveLowTimeStampCountInto( startStamp ); \ msach@94: msach@94: #define Meas_endMutexLock \ msach@94: saveLowTimeStampCountInto( endStamp ); \ msach@94: addIntervalToHist( startStamp, endStamp, \ msach@94: _VMSMasterEnv->measHists[ mutexLockHistIdx ] ); msach@94: msach@94: #define Meas_startMutexUnlock \ msach@94: int32 startStamp, endStamp; \ msach@94: saveLowTimeStampCountInto( startStamp ); \ msach@94: msach@94: #define Meas_endMutexUnlock \ msach@94: saveLowTimeStampCountInto( endStamp ); \ msach@94: addIntervalToHist( startStamp, endStamp, \ msach@94: _VMSMasterEnv->measHists[ mutexUnlockHistIdx ] ); msach@94: msach@94: #define Meas_startCondWait \ msach@94: int32 startStamp, endStamp; \ msach@94: saveLowTimeStampCountInto( startStamp ); \ msach@94: msach@94: #define Meas_endCondWait \ msach@94: saveLowTimeStampCountInto( endStamp ); \ msach@94: addIntervalToHist( startStamp, endStamp, \ msach@94: _VMSMasterEnv->measHists[ condWaitHistIdx ] ); msach@94: msach@94: #define Meas_startCondSignal \ msach@94: int32 startStamp, endStamp; \ msach@94: saveLowTimeStampCountInto( startStamp ); \ msach@94: msach@94: #define Meas_endCondSignal \ msach@94: saveLowTimeStampCountInto( endStamp ); \ msach@94: addIntervalToHist( startStamp, endStamp, \ msach@94: _VMSMasterEnv->measHists[ condSignalHistIdx ] ); msach@94: msach@94: //=========================================================================== msach@94: // VCilk msach@94: #define Meas_startSpawn \ msach@94: int32 startStamp, endStamp; \ msach@94: saveLowTimeStampCountInto( startStamp ); \ msach@94: msach@94: #define Meas_endSpawn \ msach@94: saveLowTimeStampCountInto( endStamp ); \ msach@94: addIntervalToHist( startStamp, endStamp, \ msach@94: _VMSMasterEnv->measHists[ spawnHistIdx ] ); msach@94: msach@94: #define Meas_startSync \ msach@94: int32 startStamp, endStamp; \ msach@94: saveLowTimeStampCountInto( startStamp ); \ msach@94: msach@94: #define Meas_endSync \ msach@94: saveLowTimeStampCountInto( endStamp ); \ msach@94: addIntervalToHist( startStamp, endStamp, \ msach@94: _VMSMasterEnv->measHists[ syncHistIdx ] ); msach@94: msach@94: //=========================================================================== msach@94: // SSR msach@94: #define Meas_startSendFromTo \ msach@94: int32 startStamp, endStamp; \ msach@94: saveLowTimeStampCountInto( startStamp ); \ msach@94: msach@94: #define Meas_endSendFromTo \ msach@94: saveLowTimeStampCountInto( endStamp ); \ msach@94: addIntervalToHist( startStamp, endStamp, \ msach@94: _VMSMasterEnv->measHists[ SendFromToHistIdx ] ); msach@94: msach@94: #define Meas_startSendOfType \ msach@94: int32 startStamp, endStamp; \ msach@94: saveLowTimeStampCountInto( startStamp ); \ msach@94: msach@94: #define Meas_endSendOfType \ msach@94: saveLowTimeStampCountInto( endStamp ); \ msach@94: addIntervalToHist( startStamp, endStamp, \ msach@94: _VMSMasterEnv->measHists[ SendOfTypeHistIdx ] ); msach@94: msach@94: #define Meas_startReceiveFromTo \ msach@94: int32 startStamp, endStamp; \ msach@94: saveLowTimeStampCountInto( startStamp ); \ msach@94: msach@94: #define Meas_endReceiveFromTo \ msach@94: saveLowTimeStampCountInto( endStamp ); \ msach@94: addIntervalToHist( startStamp, endStamp, \ msach@94: _VMSMasterEnv->measHists[ ReceiveFromToHistIdx ] ); msach@94: msach@94: #define Meas_startReceiveOfType \ msach@94: int32 startStamp, endStamp; \ msach@94: saveLowTimeStampCountInto( startStamp ); \ msach@94: msach@94: #define Meas_endReceiveOfType \ msach@94: saveLowTimeStampCountInto( endStamp ); \ msach@94: addIntervalToHist( startStamp, endStamp, \ msach@94: _VMSMasterEnv->measHists[ReceiveOfTypeHistIdx ] ); msach@94: msach@94: //===== msach@94: msach@94: #include "ProcrContext.h" msach@94: #include "probes.h" msach@94: #include "vutilities.h" msach@94: msach@94: #endif /* _VMS_H */ msach@94: