diff options
author | Luis Ontanon <luis.ontanon@gmail.com> | 2005-03-20 00:19:15 +0000 |
---|---|---|
committer | Luis Ontanon <luis.ontanon@gmail.com> | 2005-03-20 00:19:15 +0000 |
commit | 9e9a65836965f44d9752b41ea0c9ee03ae5749fa (patch) | |
tree | e86663ae32c8fab0aa2dc50c67e9d5f8148ecff9 /epan/stats_tree.c | |
parent | 4012e774fdf10ceafe7d6925bba54c88edff545c (diff) | |
download | wireshark-9e9a65836965f44d9752b41ea0c9ee03ae5749fa.tar.gz wireshark-9e9a65836965f44d9752b41ea0c9ee03ae5749fa.tar.bz2 wireshark-9e9a65836965f44d9752b41ea0c9ee03ae5749fa.zip |
There was a design flaw that caused a crash on windows and
left uninitialized successive copies of the stats tree.
Split the stats_tree data in two different structs one for data that's
always needed and it's not going to change at every run and another
for each run of the tap.
svn path=/trunk/; revision=13816
Diffstat (limited to 'epan/stats_tree.c')
-rw-r--r-- | epan/stats_tree.c | 134 |
1 files changed, 72 insertions, 62 deletions
diff --git a/epan/stats_tree.c b/epan/stats_tree.c index 5d08a49a58..5bc9899595 100644 --- a/epan/stats_tree.c +++ b/epan/stats_tree.c @@ -150,7 +150,7 @@ static void free_stat_node( stat_node* node ) { free_stat_node(child); } - if(node->st->free_node_pr) node->st->free_node_pr(node); + if(node->st->cfg->free_node_pr) node->st->cfg->free_node_pr(node); if (node->hash) g_hash_table_destroy(node->hash); @@ -161,19 +161,19 @@ static void free_stat_node( stat_node* node ) { g_free(node); } -/* destroys the whole tree */ +/* destroys the whole tree instance */ extern void free_stats_tree(stats_tree* st) { stat_node* child; - g_free(st->tapname); - g_free(st->abbr); g_free(st->filter); + g_hash_table_destroy(st->names); + g_ptr_array_free(st->parents,FALSE); for (child = st->root.children; child; child = child->next ) free_stat_node(child); - if (st->free_tree_pr) - st->free_tree_pr(st); + if (st->cfg->free_tree_pr) + st->cfg->free_tree_pr(st); g_free(st); } @@ -190,8 +190,8 @@ static void reset_stat_node(stat_node* node) { node->counter = 0; - if(node->st->reset_node) { - node->st->reset_node(node); + if(node->st->cfg->reset_node) { + node->st->cfg->reset_node(node); } } @@ -201,8 +201,8 @@ extern void reset_stats_tree(void* p) { stats_tree* st = p; reset_stat_node(&st->root); - if (st->reset_tree) { - st->reset_tree(st); + if (st->cfg->reset_tree) { + st->cfg->reset_tree(st); } } @@ -217,8 +217,8 @@ extern void reinit_stats_tree(void* p) { st->root.children = NULL; st->root.counter = 0; - if (st->init) { - st->init(st); + if (st->cfg->init) { + st->cfg->init(st); } } @@ -229,18 +229,49 @@ extern void register_stats_tree(guint8* tapname, stat_tree_packet_cb packet, stat_tree_init_cb init ) { - stats_tree* st = g_malloc( sizeof(stats_tree) ); + stats_tree_cfg* cfg = g_malloc( sizeof(stats_tree_cfg) ); /* at the very least the abbrev and the packet function should be given */ g_assert( tapname && abbr && packet ); - st->tapname = g_strdup(tapname); - st->abbr = g_strdup(abbr); - st->name = name ? g_strdup(name) : g_strdup(abbr); - st->filter = NULL; + cfg->tapname = g_strdup(tapname); + cfg->abbr = g_strdup(abbr); + cfg->name = name ? g_strdup(name) : g_strdup(abbr); + cfg->packet = packet; + cfg->init = init; + + /* these have to be filled in by implementations */ + cfg->setup_node_pr = NULL; + cfg->new_tree_pr = NULL; + cfg->free_node_pr = NULL; + cfg->free_tree_pr = NULL; + cfg->draw_node = NULL; + cfg->draw_tree = NULL; + cfg->reset_node = NULL; + cfg->reset_tree = NULL; + + if (!registry) registry = g_hash_table_new(g_str_hash,g_str_equal); + + g_hash_table_insert(registry,cfg->abbr,cfg); + +} + +extern stats_tree* new_stats_tree(stats_tree_cfg* cfg, tree_pres* pr,char* filter) { + stats_tree* st = g_malloc(sizeof(stats_tree)); + + st->cfg = cfg; + st->pr = pr; + + st->names = g_hash_table_new(g_str_hash,g_str_equal); + st->parents = g_ptr_array_new(); + st->filter = filter; + + st->start = -1.0; + st->elapsed = 0.0; + st->root.counter = 0; - st->root.name = g_strdup(name); + st->root.name = g_strdup(cfg->name); st->root.st = st; st->root.parent = NULL; st->root.children = NULL; @@ -248,32 +279,10 @@ extern void register_stats_tree(guint8* tapname, st->root.hash = NULL; st->root.pr = NULL; - st->names = g_hash_table_new(g_str_hash,g_str_equal); - st->parents = g_ptr_array_new(); - g_ptr_array_add(st->parents,&st->root); - st->start = -1.0; - st->elapsed = 0.0; - - st->packet = packet; - st->init = init; - - /* these have to be filled in by implementations */ - st->setup_node_pr = NULL; - st->new_tree_pr = NULL; - st->free_node_pr = NULL; - st->free_tree_pr = NULL; - st->draw_node = NULL; - st->draw_tree = NULL; - st->reset_node = NULL; - st->reset_tree = NULL; - - if (!registry) registry = g_hash_table_new(g_str_hash,g_str_equal); - - g_hash_table_insert(registry,st->abbr,st); - -} + return st; +} /* will be the tap packet cb */ extern int stats_tree_packet(void* p, packet_info* pinfo, epan_dissect_t *edt, const void *pri) { @@ -285,8 +294,8 @@ extern int stats_tree_packet(void* p, packet_info* pinfo, epan_dissect_t *edt, c st->elapsed = now - st->start; - if (st->packet) - return st->packet(st,pinfo,edt,pri); + if (st->cfg->packet) + return st->cfg->packet(st,pinfo,edt,pri); else return 0; } @@ -295,12 +304,12 @@ extern GHashTable* stat_tree_registry(void) { return registry; } -extern stats_tree* get_stats_tree_by_abbr(guint8* abbr) { +extern stats_tree_cfg* get_stats_tree_by_abbr(guint8* abbr) { return g_hash_table_lookup(registry,abbr); } -struct _stats_tree_pres_stuff { +struct _stats_tree_pres_cbs { void (*setup_node_pr)(stat_node*); void (*free_node_pr)(stat_node*); void (*draw_node)(stat_node*); @@ -312,17 +321,17 @@ struct _stats_tree_pres_stuff { }; static void setup_tree_presentation(gpointer k _U_, gpointer v, gpointer p) { - stats_tree* st = v; - struct _stats_tree_pres_stuff *d = p; - - st->setup_node_pr = d->setup_node_pr; - st->new_tree_pr = d->new_tree_pr; - st->free_node_pr = d->free_node_pr; - st->free_tree_pr = d->free_tree_pr; - st->draw_node = d->draw_node; - st->draw_tree = d->draw_tree; - st->reset_node = d->reset_node; - st->reset_tree = d->reset_tree; + stats_tree_cfg* cfg = v; + struct _stats_tree_pres_cbs *d = p; + + cfg->setup_node_pr = d->setup_node_pr; + cfg->new_tree_pr = d->new_tree_pr; + cfg->free_node_pr = d->free_node_pr; + cfg->free_tree_pr = d->free_tree_pr; + cfg->draw_node = d->draw_node; + cfg->draw_tree = d->draw_tree; + cfg->reset_node = d->reset_node; + cfg->reset_tree = d->reset_tree; } @@ -336,7 +345,7 @@ extern void stats_tree_presentation(void (*registry_iterator)(gpointer,gpointer, void (*draw_tree)(stats_tree*), void (*reset_tree)(stats_tree*), void* data) { - struct _stats_tree_pres_stuff d = {setup_node_pr,free_node_pr,draw_node,reset_node,new_tree_pr,free_tree_pr,draw_tree,reset_tree}; + struct _stats_tree_pres_cbs d = {setup_node_pr,free_node_pr,draw_node,reset_node,new_tree_pr,free_tree_pr,draw_tree,reset_tree}; if (registry) g_hash_table_foreach(registry,setup_tree_presentation,&d); @@ -407,15 +416,15 @@ static stat_node* new_stat_node(stats_tree* st, g_hash_table_insert(node->parent->hash,node->name,node); } - if (st->setup_node_pr) { - st->setup_node_pr(node); + if (st->cfg->setup_node_pr) { + st->cfg->setup_node_pr(node); } else { node->pr = NULL; } return node; } - +/***/ extern int create_node(stats_tree* st, const gchar* name, int parent_id, gboolean with_hash) { stat_node* node = new_stat_node(st,name,parent_id,with_hash,TRUE); @@ -527,13 +536,14 @@ extern int create_range_node(stats_tree* st, return rng_root->id; } +/****/ extern int get_parent_id_by_name(stats_tree* st, const gchar* parent_name) { stat_node* node = g_hash_table_lookup(st->names,parent_name); if (node) return node->id; else - return 0; /* ??? -1 ??? */ + return 0; /* XXX: this is the root shoud we return -1 instead?*/ } |