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