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