00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00047 #ifndef _M_STATS_H
00048 #define _M_STATS_H
00049 
00050 #include "result.h"
00051 
00052 
00054 #define FOREACH_STAT_XACT(ACTION)                                           \
00055   ACTION(aborts)                                                            \
00056 
00057 
00058 #ifdef _M_STATS_BUILD
00059 
00067 # define FOREACH_STAT(ACTION)                                                \
00068     FOREACH_STAT_XACT (ACTION)
00069 
00070 # define FOREACH_STATPROBE(ACTION)                                           \
00071     ACTION(XACT)
00072 
00073 # define FOREACH_VOIDSTATPROBE(ACTION)                                           
00074 
00075 
00076 #else 
00077 
00078 # define FOREACH_STAT(ACTION)          
00079 # define FOREACH_STATPROBE(ACTION)     
00080 # define FOREACH_VOIDSTATPROBE(ACTION) 
00081 
00082 #endif 
00083 
00084 typedef enum {
00085 #define STATENTRY(name) m_stats_##name##_stat,
00086         FOREACH_STAT (STATENTRY)
00087 #undef STATENTRY        
00088         m_stats_numofstats
00089 } m_stats_statentry_t; 
00090 
00091 typedef unsigned int m_stats_statcounter_t;
00092 typedef struct m_stats_threadstat_s m_stats_threadstat_t;
00093 typedef struct m_statsmgr_s m_statsmgr_t;
00094 typedef struct m_stats_statset_s m_stats_statset_t;
00095 typedef struct m_stats_stat_s m_stats_stat_t;
00096 
00097 
00099 struct m_stats_stat_s
00100 {
00101         m_stats_statcounter_t max;   
00102         m_stats_statcounter_t min;   
00103         m_stats_statcounter_t total; 
00104 }; 
00105 
00106 
00108 struct m_stats_statset_s {
00109         const char             *name;       
00110         m_stats_statcounter_t  count;       
00111         m_stats_stat_t         stats[m_stats_numofstats]; 
00112 }; 
00113 
00114 
00116 static inline
00117 void
00118 m_stats_statset_set_val(m_stats_statset_t *statset, 
00119                         m_stats_statentry_t entry,
00120                         m_stats_statcounter_t val)
00121 {
00122         statset->stats[entry].total = val;      
00123 }
00124 
00125 
00127 static inline
00128 m_stats_statcounter_t
00129 m_stats_statset_get_val(m_stats_statset_t *statset, 
00130                         m_stats_statentry_t entry)
00131 {
00132         return statset->stats[entry].total;
00133 }
00134 
00135 
00136 #define GENERATE_STATPROBES(stat_provider)                                     \
00137 static inline                                                                  \
00138 void                                                                           \
00139 m_stats_statset_increment_##stat_provider(m_statsmgr_t *statsmgr,              \
00140                                           m_stats_statset_t *statset,          \
00141                                           m_stats_statentry_t entry,           \
00142                                           m_stats_statcounter_t val)           \
00143 {                                                                              \
00144     if (statsmgr) {                                                            \
00145         m_stats_statset_set_val(statset,                                       \
00146                                 entry,                                         \
00147                                 m_stats_statset_get_val(statset, entry) + val);\
00148     }                                                                                                  \
00149 }                                                                                                                      \
00150                                                                                \
00151 static inline                                                                  \
00152 void                                                                           \
00153 m_stats_statset_decrement_##stat_provider(m_statsmgr_t *statsmgr,              \
00154                                           m_stats_statset_t *statset,          \
00155                                           m_stats_statentry_t entry,           \
00156                                           m_stats_statcounter_t val)           \
00157 {                                                                              \
00158         if (statsmgr) {                                                            \
00159         m_stats_statset_set_val(statset,                                       \
00160                                 entry,                                         \
00161                                 m_stats_statset_get_val(statset, entry) - val);\
00162     }                                                                                                  \
00163 }                                                                                                                      \
00164 
00165 
00166 #define GENERATE_VOIDSTATPROBES(stat_provider)                               \
00167 static inline                                                                \
00168 void                                                                         \
00169 m_stats_statset_increment_##stat_provider(m_statsmgr_t *statsmgr,            \
00170                                           m_stats_statset_t *statset,        \
00171                                           m_stats_statentry_t entry,         \
00172                                           m_stats_statcounter_t val)         \
00173 {                                                                            \
00174         return ;                                                                 \
00175 }                                                                                                                    \
00176                                                                              \
00177 static inline                                                                \
00178 void                                                                         \
00179 m_stats_statset_decrement_##stat_provider(m_statsmgr_t *statsmgr,            \
00180                                           m_stats_statset_t *statset,        \
00181                                           m_stats_statentry_t entry,         \
00182                                           m_stats_statcounter_t val)         \
00183 {                                                                            \
00184         return ;                                                                 \
00185 }                                                                                                                    \
00186 
00187 
00188 FOREACH_STATPROBE (GENERATE_STATPROBES)
00189 FOREACH_VOIDSTATPROBE (GENERATE_VOIDSTATPROBES)
00190 
00191 
00192 #define m_stats_statset_increment(statsmgr, statset, stat_provider, stat, val) \
00193   m_stats_statset_increment_##stat_provider(statsmgr,                          \
00194                                             statset,                           \
00195                                                                                         m_stats_##stat##_stat,             \
00196                                             val);
00197 
00198 #define m_stats_statset_decrement(statsmgr, statset, stat_provider, stat, val) \
00199   m_stats_statset_decrement_##stat_provider(statsmgr,                          \
00200                                             statset,                           \
00201                                             m_stats_##stat##_stat,             \
00202                                             val);
00203 
00204 
00205 m_result_t m_statsmgr_create(m_statsmgr_t **statsmgrp, char *output_file);
00206 m_result_t m_statsmgr_destroy(m_statsmgr_t **statsmgrp);
00207 m_result_t m_stats_threadstat_create(m_statsmgr_t *statsmgr, unsigned int tid, m_stats_threadstat_t **threadstatp);
00208 m_result_t m_stats_statset_create(m_stats_statset_t **statsetp);
00209 m_result_t m_stats_statset_destroy(m_stats_statset_t **statsetp);
00210 m_result_t m_stats_statset_init(m_stats_statset_t *statset, const char *name);
00211 void m_stats_print(m_statsmgr_t *statsmgr);
00212 
00213 #endif