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
00033
00034
00035 #ifndef _STATISTICS_H_
00036 #define _STATISTICS_H_
00037
00038 #include "hash_func.h"
00039 #include "atomic.h"
00040
00041 #define STATS_HASH_POWER 8
00042 #define STATS_HASH_SIZE (1<<(STATS_HASH_POWER))
00043
00044 #define NUM_IP_OCTETS 4
00045
00046 #define STAT_NO_RESET (1<<0)
00047 #define STAT_NO_SYNC (1<<1)
00048 #define STAT_SHM_NAME (1<<2)
00049 #define STAT_IS_FUNC (1<<3)
00050
00051 #ifdef NO_ATOMIC_OPS
00052 typedef unsigned int stat_val;
00053 #else
00054 typedef atomic_t stat_val;
00055 #endif
00056
00057 typedef unsigned long (*stat_function)(void);
00058
00059 struct module_stats_;
00060
00061 typedef struct stat_var_{
00062 unsigned int mod_idx;
00063 str name;
00064 int flags;
00065 union{
00066 stat_val *val;
00067 stat_function f;
00068 }u;
00069 struct stat_var_ *hnext;
00070 struct stat_var_ *lnext;
00071 } stat_var;
00072
00073 typedef struct module_stats_ {
00074 str name;
00075 int no;
00076 stat_var *head;
00077 stat_var *tail;
00078 } module_stats;
00079
00080 typedef struct stats_collector_ {
00081 int stats_no;
00082 int mod_no;
00083 stat_var* hstats[STATS_HASH_SIZE];
00084 module_stats *amodules;
00085 }stats_collector;
00086
00087 typedef struct stat_export_ {
00088 char* name;
00089 int flags;
00090 stat_var** stat_pointer;
00091
00092 } stat_export_t;
00093
00094
00095 #ifdef STATISTICS
00096 int init_stats_collector(void);
00097
00098 void destroy_stats_collector(void);
00099
00100 int register_stat( char *module, char *name, stat_var **pvar, int flags);
00101
00102 int register_module_stats(char *module, stat_export_t *stats);
00103
00104 stat_var* get_stat( str *name );
00105
00106 unsigned int get_stat_val( stat_var *var );
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 stat_var *get_stat_var_from_num_code(unsigned int numerical_code, int in_codes);
00118
00119
00120 #ifdef NO_ATOMIC_OPS
00121 #include "locking.h"
00122 extern gen_lock_t *stat_lock;
00123 #endif
00124
00125 #else
00126 #define init_stats_collector() 0
00127 #define destroy_stats_collector()
00128 #define register_module_stats(_mod,_stats) 0
00129 #define register_stat( _mod, _name, _pvar, _flags) 0
00130 #define get_stat( _name ) 0
00131 #define get_stat_val( _var ) 0
00132 #define get_stat_var_from_num_code( _n_code, _in_code) NULL
00133 #endif
00134
00135
00136 #ifdef STATISTICS
00137 #ifdef NO_ATOMIC_OPS
00138 #define update_stat( _var, _n) \
00139 do { \
00140 if ( !((_var)->flags&STAT_IS_FUNC) ) {\
00141 if ((_var)->flags&STAT_NO_SYNC) {\
00142 *((_var)->u.val) += _n;\
00143 } else {\
00144 lock_get(stat_lock);\
00145 *((_var)->u.val) += _n;\
00146 lock_release(stat_lock);\
00147 }\
00148 }\
00149 }while(0)
00150 #define reset_stat( _var) \
00151 do { \
00152 if ( ((_var)->flags&(STAT_NO_RESET|STAT_IS_FUNC))==0 ) {\
00153 if ((_var)->flags&STAT_NO_SYNC) {\
00154 *((_var)->u.val) = 0;\
00155 } else {\
00156 lock_get(stat_lock);\
00157 *((_var)->u.val) = 0;\
00158 lock_release(stat_lock);\
00159 }\
00160 }\
00161 }while(0)
00162 #define get_stat_val( _var ) ((unsigned long)\
00163 ((_var)->flags&STAT_IS_FUNC)?(_var)->u.f():*((_var)->u.val))
00164 #else
00165 #define update_stat( _var, _n) \
00166 do { \
00167 if ( !((_var)->flags&STAT_IS_FUNC) ) {\
00168 if (_n>=0) \
00169 atomic_add( _n, (_var)->u.val);\
00170 else \
00171 atomic_sub( -(_n), (_var)->u.val);\
00172 }\
00173 }while(0)
00174 #define reset_stat( _var) \
00175 do { \
00176 if ( ((_var)->flags&(STAT_NO_RESET|STAT_IS_FUNC))==0 ) {\
00177 atomic_set( (_var)->u.val, 0);\
00178 }\
00179 }while(0)
00180 #define get_stat_val( _var ) ((unsigned long)\
00181 ((_var)->flags&STAT_IS_FUNC)?(_var)->u.f():(_var)->u.val->counter)
00182 #endif
00183
00184 #define if_update_stat(_c, _var, _n) \
00185 do { \
00186 if (_c) update_stat( _var, _n); \
00187 }while(0)
00188 #define if_reset_stat(_c, _var) \
00189 do { \
00190 if (_c) reset_stat( _var); \
00191 }while(0)
00192 #else
00193 #define update_stat( _var, _n)
00194 #define reset_stat( _var)
00195 #define if_update_stat( _c, _var, _n)
00196 #define if_reset_stat( _c, _var)
00197 #endif
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230 int get_socket_list_from_proto(int **ipList, int protocol);
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240 int get_total_bytes_waiting(void);
00241
00242 #endif