profile.h
Go to the documentation of this file.00001
00011 #ifndef CTL_PROFILE_H
00012 #define CTL_PROFILE_H
00013
00014 #ifndef CTLDEF_H
00015 #include "ctl/ctldef.h"
00016 #endif
00017 #ifndef CTL_MSTIME_H
00018 #include "ctl/mstime.h"
00019 #endif
00020 #ifndef LL_H
00021 #include "ctl/ll.h"
00022 #endif
00023
00024 void ctl_profiles_dump(void);
00025 void ctl_profiles_global_reset(void);
00026 void ctl_profiles_dump_averages_sheet(void);
00027
00028 typedef enum ctl_profile_type
00029 {
00030 ctl_profile_type_profile,
00031 ctl_profile_type_average,
00032 ctl_profile_type_counter,
00033 ctl_profile_type_testpoint,
00034 } ctl_profile_type;
00035
00039 typedef struct ctl_profile
00040 {
00041 struct ctl_profile* next;
00042 ctl_profile_type type;
00043 const char* label;
00045 int (*print)( char* buff, size_t size, const struct ctl_profile* self );
00046 ustime usPrev;
00047 ustime usCurr;
00048 } ctl_profile;
00049 void ctl_profile_init( ctl_profile* self, const char* label );
00050
00054 typedef struct ctl_profile_average
00055 {
00056 ctl_profile profile;
00057 ustime total;
00058 ustime max;
00059 ustime min;
00060 uint64 count;
00061 } ctl_profile_average;
00062 void ctl_profile_average_init( ctl_profile_average* self, const char* label );
00063
00067 typedef struct ctl_profile_counter
00068 {
00069 ctl_profile profile;
00070 ustime window;
00071 ustime began;
00072 ustime last;
00073 uint64 count;
00074 } ctl_profile_counter;
00075 void ctl_profile_counter_init( ctl_profile_counter* self, const char* label, mstime window );
00076
00080 typedef struct ctl_profile_testpoint
00081 {
00082 ctl_profile profile;
00083 int64 count;
00084 int64 value;
00085 int64 min;
00086 int64 max;
00087 } ctl_profile_testpoint;
00088 void ctl_profile_testpoint_init( ctl_profile_testpoint* self, const char* label );
00089
00090 #if defined(PROFILE)
00091
00093 #define ppProfile(p) p
00094
00096 #define ppNotProfile(p)
00097
00099 #define ppProfileElse(p,e) p
00100
00113 #define ctl_profile_begin(codelabel,strlabel)\
00114 {\
00115 static ctl_profile codelabel = { NULL };\
00116 if( NULL == codelabel.next ) ctl_profile_init( &codelabel, (strlabel) );\
00117 codelabel.usCurr = -ctl_ustime()
00118
00123 #define ctl_profile_end(codelabel) \
00124 (codelabel).usPrev = (codelabel).usCurr = (codelabel).usCurr + ctl_ustime();\
00125 }
00126
00131 #define ctl_profile_reset(codelabel)\
00132 (codelabel).usPrev = (codelabel).usCurr = -1
00133
00140 #define ctl_profile_average_begin(codelabel,strlabel)\
00141 {\
00142 static ctl_profile_average codelabel = { {NULL} };\
00143 if( NULL == codelabel.profile.next ) ctl_profile_average_init( &codelabel, (strlabel) );\
00144 codelabel.profile.usCurr = -ctl_ustime()
00145
00150 #define ctl_profile_average_end(codelabel) \
00151 (codelabel).profile.usPrev = (codelabel).profile.usCurr = (codelabel).profile.usCurr + ctl_ustime();\
00152 (codelabel).total += (codelabel).profile.usCurr;\
00153 if( (codelabel).max < (codelabel).profile.usCurr )\
00154 (codelabel).max = (codelabel).profile.usCurr;\
00155 if( (codelabel).min > (codelabel).profile.usCurr )\
00156 (codelabel).min = (codelabel).profile.usCurr;\
00157 ++(codelabel).count;\
00158 }
00159
00164 #define profile_average_reset(codelabel)\
00165 {\
00166 ctl_profile_reset(codelabel);\
00167 (codelabel).total = 0;\
00168 (codelabel).count = 0;\
00169 }
00170
00177 #define ctl_profile_counter_begin(codelabel,strlabel,window)\
00178 {\
00179 static ctl_profile_counter codelabel = { {NULL} };\
00180 if( NULL == codelabel.profile.next ) ctl_profile_counter_init( &codelabel, (strlabel), (window) );\
00181 (codelabel).profile.usCurr = -ctl_ustime()
00182
00187 #define ctl_profile_counter_end(codelabel) \
00188 {\
00189 ustime elapse = ((codelabel).last = ctl_ustime()) - (codelabel).began;\
00190 (codelabel).profile.usPrev = (codelabel).profile.usCurr = (codelabel).profile.usCurr + (codelabel).last;\
00191 ++(codelabel).count;\
00192 if( 0 != (codelabel).window && elapse > (codelabel).window )\
00193 {\
00194 ctl_profile_counter_reset(codelabel);\
00195 }\
00196 }\
00197 }
00198
00199 #define ctl_profile_counter_reset(codelabel)\
00200 {\
00201 (codelabel).began = (codelabel).last = ctl_ustime();\
00202 }
00203
00210 #define ctl_profile_testpoint_measure(codelabel,strlabel,value)\
00211 {\
00212 static ctl_profile_testpoint codelabel = { {NULL} };\
00213 if( NULL == codelabel.profile.next ) ctl_profile_testpoint_init( &codelabel, (strlabel) );\
00214 codelabel.value = (int64)(value);\
00215 if( codelabel.min > codelabel.value )\
00216 codelabel.min = codelabel.value;\
00217 if( codelabel.max < codelabel.value )\
00218 codelabel.max = codelabel.value;\
00219 codelabel.count++;\
00220 }
00221
00222
00223 #else
00224
00225 #define ppProfile(p)
00226 #define ppNotProfile(p) p
00227 #define ppProfileElse(p,e) e
00228
00229 #define ctl_profile_begin(codelabel,strlabel)
00230 #define ctl_profile_end(codelabel)
00231 #define ctl_profile_reset(codelabel)
00232
00233 #define ctl_profile_average_begin(codelabel,strlabel)
00234 #define ctl_profile_average_end(codelabel)
00235 #define ctl_profile_average_reset(codelabel)
00236
00237 #define ctl_profile_counter_begin(codelabel,strlabel,window)
00238 #define ctl_profile_counter_end(codelabel)
00239 #define ctl_profile_counter_reset(codelabel)
00240
00241 #endif
00242
00243 #endif