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 /* !defined(PROFILE) */
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 /* defined(PROFILE) */
00242 
00243 #endif /*CTL_PROFILE_H*/

Generated on Fri Jan 2 15:28:34 2009 for Squat by  doxygen 1.5.6