Me@50: /* Me@50: * Copyright 2009 OpenSourceStewardshipFoundation.org Me@50: * Licensed under GNU General Public License version 2 Me@50: * Me@50: * Author: seanhalle@yahoo.com Me@50: * Me@50: */ Me@50: Me@50: #ifndef _PROBES_H Me@50: #define _PROBES_H msach@76: #define _GNU_SOURCE Me@50: Me@50: #include "VMS_primitive_data_types.h" Me@50: Me@50: #include Me@50: Me@50: Me@50: //when STATS__TURN_ON_PROBES is defined allows using probes to measure Me@50: // time intervals. The probes are macros that only compile to something Me@50: // when STATS__TURN_ON_PROBES is defined. The probes are saved in the Me@50: // master env -- but only when this is defined. Me@50: //The TSC probes use RDTSC instr, can be unreliable, Dbl uses gettimeofday Me@50: #define STATS__TURN_ON_PROBES Me@50: //#define STATS__USE_TSC_PROBES Me@50: #define STATS__USE_DBL_PROBES Me@50: Me@50: //typedef struct _IntervalProbe IntervalProbe; //in VMS.h Me@50: Me@50: struct _IntervalProbe Me@50: { Me@50: char *nameStr; Me@50: int32 probeID; Me@50: Me@50: int32 schedChoiceWasRecorded; Me@50: int32 coreNum; Me@50: int32 procrID; Me@50: float64 procrCreateSecs; Me@50: Me@50: #ifdef STATS__USE_TSC_PROBES Me@50: TSCount startStamp; Me@50: TSCount endStamp; Me@50: #else Me@50: struct timeval startStamp; Me@50: struct timeval endStamp; Me@50: #endif Me@50: float64 startSecs; Me@50: float64 endSecs; Me@50: float64 interval; Me@50: DblHist *hist;//if NULL, then is single interval probe Me@50: }; Me@50: Me@50: Me@50: //============================= Statistics ================================== Me@50: Me@50: //Frequency of TS counts Me@50: //TODO: change freq for each machine Me@50: #define TSCOUNT_FREQ 3180000000 Me@50: Me@50: inline TSCount getTSCount(); Me@50: Me@50: Me@50: //======================== Probes ============================= Me@50: // Me@50: // Use macros to allow turning probes off with a #define switch Me@50: #ifdef STATS__ENABLE_PROBES Me@50: int32 Me@50: VMS_impl__record_time_point_into_new_probe( char *nameStr,VirtProcr *animPr); Me@50: #define VMS__record_time_point_into_new_probe( nameStr, animPr ) \ Me@50: VMS_impl__record_time_point_in_new_probe( nameStr, animPr ) Me@50: Me@50: int32 Me@52: VMS_ext_impl__record_time_point_into_new_probe( char *nameStr ); Me@50: #define VMS_ext__record_time_point_into_new_probe( nameStr ) \ Me@52: VMS_ext_impl__record_time_point_into_new_probe( nameStr ) Me@50: Me@50: Me@50: int32 Me@50: VMS_impl__create_single_interval_probe( char *nameStr, VirtProcr *animPr ); Me@50: #define VMS__create_single_interval_probe( nameStr, animPr ) \ Me@50: VMS_impl__create_single_interval_probe( nameStr, animPr ) Me@50: Me@50: Me@50: int32 Me@50: VMS_impl__create_histogram_probe( int32 numBins, float64 startValue, Me@50: float64 binWidth, char *nameStr, VirtProcr *animPr ); Me@50: #define VMS__create_histogram_probe( numBins, startValue, \ Me@50: binWidth, nameStr, animPr ) \ Me@50: VMS_impl__create_histogram_probe( numBins, startValue, \ Me@50: binWidth, nameStr, animPr ) Me@53: void Me@53: VMS_impl__free_probe( IntervalProbe *probe ); Me@53: #define VMS__free_probe( probe ) \ Me@53: VMS_impl__free_probe( probe ) Me@50: Me@50: void Me@50: VMS_impl__index_probe_by_its_name( int32 probeID, VirtProcr *animPr ); Me@50: #define VMS__index_probe_by_its_name( probeID, animPr ) \ Me@50: VMS_impl__index_probe_by_its_name( probeID, animPr ) Me@50: Me@50: IntervalProbe * Me@50: VMS_impl__get_probe_by_name( char *probeName, VirtProcr *animPr ); Me@50: #define VMS__get_probe_by_name( probeID, animPr ) \ Me@50: VMS_impl__get_probe_by_name( probeName, animPr ) Me@50: Me@50: void Me@50: VMS_impl__record_sched_choice_into_probe( int32 probeID, VirtProcr *animPr ); Me@50: #define VMS__record_sched_choice_into_probe( probeID, animPr ) \ Me@50: VMS_impl__record_sched_choice_into_probe( probeID, animPr ) Me@50: Me@50: void Me@50: VMS_impl__record_interval_start_in_probe( int32 probeID ); Me@50: #define VMS__record_interval_start_in_probe( probeID ) \ Me@50: VMS_impl__record_interval_start_in_probe( probeID ) Me@50: Me@50: void Me@50: VMS_impl__record_interval_end_in_probe( int32 probeID ); Me@50: #define VMS__record_interval_end_in_probe( probeID ) \ Me@50: VMS_impl__record_interval_end_in_probe( probeID ) Me@50: Me@50: void Me@50: VMS_impl__print_stats_of_probe( int32 probeID ); Me@50: #define VMS__print_stats_of_probe( probeID ) \ Me@50: VMS_impl__print_stats_of_probe( probeID ) Me@50: Me@50: void Me@50: VMS_impl__print_stats_of_all_probes(); msach@78: #define VMS__print_stats_of_all_probes() \ msach@78: VMS_impl__print_stats_of_all_probes() Me@50: Me@50: Me@50: #else Me@50: int32 Me@50: VMS_impl__record_time_point_into_new_probe( char *nameStr,VirtProcr *animPr); Me@50: #define VMS__record_time_point_into_new_probe( nameStr, animPr ) \ Me@50: 0 /* do nothing */ Me@50: Me@50: int32 Me@65: VMS_ext_impl__record_time_point_into_new_probe( char *nameStr ); Me@50: #define VMS_ext__record_time_point_into_new_probe( nameStr ) \ Me@50: 0 /* do nothing */ Me@50: Me@50: Me@50: int32 Me@50: VMS_impl__create_single_interval_probe( char *nameStr, VirtProcr *animPr ); Me@50: #define VMS__create_single_interval_probe( nameStr, animPr ) \ Me@50: 0 /* do nothing */ Me@50: Me@50: Me@50: int32 Me@50: VMS_impl__create_histogram_probe( int32 numBins, float64 startValue, Me@50: float64 binWidth, char *nameStr, VirtProcr *animPr ); Me@50: #define VMS__create_histogram_probe( numBins, startValue, \ Me@50: binWidth, nameStr, animPr ) \ Me@50: 0 /* do nothing */ Me@50: Me@50: void Me@50: VMS_impl__index_probe_by_its_name( int32 probeID, VirtProcr *animPr ); Me@50: #define VMS__index_probe_by_its_name( probeID, animPr ) \ Me@50: /* do nothing */ Me@50: Me@50: IntervalProbe * Me@50: VMS_impl__get_probe_by_name( char *probeName, VirtProcr *animPr ); Me@50: #define VMS__get_probe_by_name( probeID, animPr ) \ Me@50: NULL /* do nothing */ Me@50: Me@50: void Me@50: VMS_impl__record_sched_choice_into_probe( int32 probeID, VirtProcr *animPr ); Me@50: #define VMS__record_sched_choice_into_probe( probeID, animPr ) \ Me@50: /* do nothing */ Me@50: Me@50: void Me@50: VMS_impl__record_interval_start_in_probe( int32 probeID ); Me@50: #define VMS__record_interval_start_in_probe( probeID ) \ Me@50: /* do nothing */ Me@50: Me@50: void Me@50: VMS_impl__record_interval_end_in_probe( int32 probeID ); Me@50: #define VMS__record_interval_end_in_probe( probeID ) \ Me@50: /* do nothing */ Me@50: Me@65: inline void doNothing(); Me@50: void Me@50: VMS_impl__print_stats_of_probe( int32 probeID ); Me@50: #define VMS__print_stats_of_probe( probeID ) \ Me@65: doNothing/* do nothing */ Me@50: Me@50: void Me@50: VMS_impl__print_stats_of_all_probes(); Me@50: #define VMS__print_stats_of_all_probes \ Me@65: doNothing/* do nothing */ Me@50: Me@50: #endif /* defined STATS__ENABLE_PROBES */ Me@50: Me@50: #endif /* _PROBES_H */ Me@50: