Module: sip-router
Branch: master
Commit: d4a66dae4e6e4f7a2129a1975b132eea90de71e5
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=d4a66da…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Mon Apr 25 12:23:46 2011 +0200
kex: added mi cmd clear_statistics
- return the values and rested the counters for statistics
- patch by Paul Pankhurst
---
modules_k/kex/core_stats.c | 122 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 122 insertions(+), 0 deletions(-)
diff --git a/modules_k/kex/core_stats.c b/modules_k/kex/core_stats.c
index 9974056..4a5455d 100644
--- a/modules_k/kex/core_stats.c
+++ b/modules_k/kex/core_stats.c
@@ -95,10 +95,12 @@ stat_export_t shm_stats[] = {
static struct mi_root *mi_get_stats(struct mi_root *cmd, void *param);
static struct mi_root *mi_reset_stats(struct mi_root *cmd, void *param);
+static struct mi_root *mi_clear_stats(struct mi_root *cmd, void *param);
static mi_export_t mi_stat_cmds[] = {
{ "get_statistics", mi_get_stats, 0 , 0, 0 },
{ "reset_statistics", mi_reset_stats, 0 , 0, 0 },
+ { "clear_statistics", mi_clear_stats, 0 , 0, 0 },
{ 0, 0, 0, 0, 0}
};
@@ -329,6 +331,126 @@ static struct mi_root *mi_reset_stats(struct mi_root *cmd, void
*param)
return rpl_tree;
}
+
+inline static int mi_reset_and_add_stat(struct mi_node *rpl, stat_var *stat)
+{
+ struct mi_node *node;
+ long old_val, new_val;
+
+ if (stats_support()==0) return -1;
+
+ old_val=get_stat_val_long(stat);
+ reset_stat(stat);
+ new_val=get_stat_val_long(stat);
+
+ if (old_val==new_val)
+ {
+ node = addf_mi_node_child(rpl, 0, 0, 0, "%s:%s = %lu",
+ ZSW(get_stat_module(stat)),
+ ZSW(get_stat_name(stat)),
+ new_val);
+ } else {
+ node = addf_mi_node_child(rpl, 0, 0, 0, "%s:%s = %lu (%lu)",
+ ZSW(get_stat_module(stat)),
+ ZSW(get_stat_name(stat)),
+ new_val, old_val );
+ }
+
+ if (node==0)
+ return -1;
+ return 0;
+}
+
+
+/* callback for counter_iterate_grp_vars to reset counters */
+static void mi_add_grp_vars_cbk2(void* r, str* g, str* n, counter_handle_t h)
+{
+ struct mi_node *rpl;
+ struct mi_node *node;
+ counter_val_t old_val, new_val;
+
+ rpl = r;
+ old_val = counter_get_val(h);
+ counter_reset(h);
+ new_val = counter_get_val(h);
+
+ if (old_val==new_val)
+ {
+ node = addf_mi_node_child(rpl, 0, 0, 0, "%.*s:%.*s = %lu",
+ g->len, g->s, n->len, n->s, new_val);
+ } else {
+ node = addf_mi_node_child(rpl, 0, 0, 0, "%.*s:%.*s = %lu (%lu)",
+ g->len, g->s, n->len, n->s, new_val, old_val);
+ }
+}
+
+
+/* callback for counter_iterate_grp_names to reset counters */
+static void mi_add_all_grps_cbk2(void* p, str* g)
+{
+ counter_iterate_grp_vars(g->s, mi_add_grp_vars_cbk2, p);
+}
+
+
+static struct mi_root *mi_clear_stats(struct mi_root *cmd, void *param)
+{
+ struct mi_root *rpl_tree;
+ struct mi_node *rpl;
+ struct mi_node *arg;
+ stat_var *stat;
+ str val;
+
+ if(stats_support()==0)
+ return init_mi_tree( 404, "Statistics Not Found", 20);
+
+ if (cmd->node.kids==NULL)
+ return init_mi_tree( 400, MI_MISSING_PARM_S, MI_MISSING_PARM_LEN);
+
+ rpl_tree = init_mi_tree( 200, MI_OK_S, MI_OK_LEN);
+ if (rpl_tree==0)
+ return 0;
+ rpl = &rpl_tree->node;
+
+ for( arg=cmd->node.kids ; arg ; arg=arg->next)
+ {
+ if (arg->value.len==0)
+ continue;
+
+ val = arg->value;
+
+ if ( val.len==3 && memcmp(val.s,"all",3)==0) {
+ /* add all statistic variables */
+ /* use direct counters access for that */
+ counter_iterate_grp_names(mi_add_all_grps_cbk2, rpl);
+ } else if ( val.len>1 && val.s[val.len-1]==':') {
+ /* add module statistics */
+ val.len--;
+ val.s[val.len]=0; /* zero term. */
+ /* use direct counters access for that */
+ counter_iterate_grp_vars(val.s, mi_add_grp_vars_cbk2, rpl);
+ val.s[val.len]=':' /* restore */;
+ } else {
+ /* reset & return only one statistic */
+ stat = get_stat( &val );
+
+ if (stat==0)
+ continue;
+ if (mi_reset_and_add_stat(rpl,stat)!=0)
+ goto error;
+ }
+ }
+
+ if (rpl->kids==0) {
+ free_mi_tree(rpl_tree);
+ return init_mi_tree( 404, "Statistics Not Found", 20);
+ }
+
+ return rpl_tree;
+error:
+ free_mi_tree(rpl_tree);
+ return 0;
+}
+
/*** shm stats ***/
static struct mem_info _stats_shm_mi;