summaryrefslogtreecommitdiff
path: root/epan/wmem/wmem_tree.c
diff options
context:
space:
mode:
authorEvan Huus <eapache@gmail.com>2013-06-17 00:08:44 +0000
committerEvan Huus <eapache@gmail.com>2013-06-17 00:08:44 +0000
commitfd22c548f536db18cfb2a3126ee9caba1c815532 (patch)
tree6093fbc901f92cf6144079debb334de91ff96dd2 /epan/wmem/wmem_tree.c
parent55264582bee31014d5d5a95b877b549287695bcd (diff)
downloadwireshark-fd22c548f536db18cfb2a3126ee9caba1c815532.tar.gz
Much smarter handling of autoreset trees.
svn path=/trunk/; revision=49970
Diffstat (limited to 'epan/wmem/wmem_tree.c')
-rw-r--r--epan/wmem/wmem_tree.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/epan/wmem/wmem_tree.c b/epan/wmem/wmem_tree.c
index 929d5f0c53..497801b21e 100644
--- a/epan/wmem/wmem_tree.c
+++ b/epan/wmem/wmem_tree.c
@@ -55,6 +55,8 @@ struct _wmem_tree_t {
wmem_allocator_t *master;
wmem_allocator_t *allocator;
wmem_tree_node_t *root;
+ guint master_cb_id;
+ guint slave_cb_id;
};
static wmem_tree_node_t *
@@ -231,16 +233,32 @@ wmem_tree_new(wmem_allocator_t *allocator)
}
static gboolean
-wmem_tree_reset(wmem_allocator_t *allocator _U_, wmem_cb_event_t event _U_,
+wmem_tree_reset_cb(wmem_allocator_t *allocator _U_, wmem_cb_event_t event,
void *user_data)
{
wmem_tree_t *tree = (wmem_tree_t *)user_data;
tree->root = NULL;
+ if (event == WMEM_CB_DESTROY_EVENT) {
+ wmem_unregister_callback(tree->master, tree->master_cb_id);
+ wmem_free(tree->master, tree);
+ }
+
return TRUE;
}
+static gboolean
+wmem_tree_destroy_cb(wmem_allocator_t *allocator _U_, wmem_cb_event_t event _U_,
+ void *user_data)
+{
+ wmem_tree_t *tree = (wmem_tree_t *)user_data;
+
+ wmem_unregister_callback(tree->allocator, tree->slave_cb_id);
+
+ return FALSE;
+}
+
wmem_tree_t *
wmem_tree_new_autoreset(wmem_allocator_t *master, wmem_allocator_t *slave)
{
@@ -251,7 +269,10 @@ wmem_tree_new_autoreset(wmem_allocator_t *master, wmem_allocator_t *slave)
tree->allocator = slave;
tree->root = NULL;
- wmem_register_callback(slave, wmem_tree_reset, tree);
+ tree->master_cb_id = wmem_register_callback(master, wmem_tree_destroy_cb,
+ tree);
+ tree->slave_cb_id = wmem_register_callback(slave, wmem_tree_reset_cb,
+ tree);
return tree;
}