diff options
author | Michael Mann <mmann78@netscape.net> | 2017-03-04 08:26:22 -0500 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2017-03-05 03:39:00 +0000 |
commit | b7d6cca4aeffcf8df55d6fa2e4417b731923ac8c (patch) | |
tree | 4a8660df14e76488bb4892b3bbe6c77b6fd0980c | |
parent | 9b4f325132091c053131b352df914f378286809a (diff) |
Add wmem_tree_destroy
Allows the cleanup of NULL scoped wmem trees
Change-Id: I7c49a224ca7e2f7ddfe0e38d3ea0e79aa2cb057c
Reviewed-on: https://code.wireshark.org/review/20382
Reviewed-by: Michael Mann <mmann78@netscape.net>
Petri-Dish: Michael Mann <mmann78@netscape.net>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Evan Huus <eapache@gmail.com>
-rw-r--r-- | epan/wmem/wmem_tree.c | 39 | ||||
-rw-r--r-- | epan/wmem/wmem_tree.h | 5 |
2 files changed, 44 insertions, 0 deletions
diff --git a/epan/wmem/wmem_tree.c b/epan/wmem/wmem_tree.c index 9a76c02982..c7f3f56ebd 100644 --- a/epan/wmem/wmem_tree.c +++ b/epan/wmem/wmem_tree.c @@ -265,6 +265,45 @@ wmem_tree_new_autoreset(wmem_allocator_t *master, wmem_allocator_t *slave) return tree; } +static void +free_tree_node(wmem_allocator_t *allocator, wmem_tree_node_t* node, gboolean free_keys, gboolean free_values) +{ + if (node == NULL) { + return; + } + + if (node->left) { + free_tree_node(allocator, node->left, free_keys, free_values); + } + + if (node->is_subtree) { + wmem_tree_destroy((wmem_tree_t *)node->data, free_keys, free_values); + node->data = NULL; + } + + if (node->right) { + free_tree_node(allocator, node->right, free_keys, free_values); + } + + if (free_keys) { + wmem_free(allocator, (void*)node->key); + } + + if (free_values) { + wmem_free(allocator, node->data); + } + wmem_free(allocator, node); +} + +void +wmem_tree_destroy(wmem_tree_t *tree, gboolean free_keys, gboolean free_values) +{ + free_tree_node(tree->allocator, tree->root, free_keys, free_values); + wmem_unregister_callback(tree->master, tree->master_cb_id); + wmem_unregister_callback(tree->allocator, tree->slave_cb_id); + wmem_free(tree->master, tree); +} + gboolean wmem_tree_is_empty(wmem_tree_t *tree) { diff --git a/epan/wmem/wmem_tree.h b/epan/wmem/wmem_tree.h index bcb7fdf783..b02ba320d0 100644 --- a/epan/wmem/wmem_tree.h +++ b/epan/wmem/wmem_tree.h @@ -72,6 +72,11 @@ wmem_tree_t * wmem_tree_new_autoreset(wmem_allocator_t *master, wmem_allocator_t *slave) G_GNUC_MALLOC; +/** Cleanup memory used by tree. Intended for NULL scope allocated trees */ +WS_DLL_PUBLIC +void +wmem_tree_destroy(wmem_tree_t *tree, gboolean free_keys, gboolean free_values); + /** Returns true if the tree is empty (has no nodes). */ WS_DLL_PUBLIC gboolean |