aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStig Bjørlykke <stig@bjorlykke.org>2015-08-11 16:11:46 +0200
committerStig Bjørlykke <stig@bjorlykke.org>2015-08-11 14:15:49 +0000
commitd6c6b0899d46c2592388c8830fc7a6e0e1e2ae8a (patch)
treefed54d7a05e850db289ece4143088d7947de56da
parentecc4f756bdb6175cc0b3b11af2f90884db1c602c (diff)
wmem: Mark removed strings with is_removed
This will allow integer value 0 again. Change-Id: Ibfa4249ea8b887971d3b3214ad9e4d095d20d155 Reviewed-on: https://code.wireshark.org/review/9973 Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org>
-rw-r--r--epan/wmem/wmem_tree.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/epan/wmem/wmem_tree.c b/epan/wmem/wmem_tree.c
index d82dc95b75..7013ab5dae 100644
--- a/epan/wmem/wmem_tree.c
+++ b/epan/wmem/wmem_tree.c
@@ -48,6 +48,7 @@ struct _wmem_tree_node_t {
wmem_node_color_t color;
gboolean is_subtree;
+ gboolean is_removed;
};
typedef struct _wmem_tree_node_t wmem_tree_node_t;
@@ -303,6 +304,7 @@ create_node(wmem_allocator_t *allocator, wmem_tree_node_t *parent, const void *k
node->color = color;
node->is_subtree = is_subtree;
+ node->is_removed = FALSE;
return node;
}
@@ -413,6 +415,9 @@ wmem_tree_insert(wmem_tree_t *tree, const void *key, void *data, compare_func cm
int result = cmp(key, node->key);
if (result == 0) {
node->data = data;
+ if (!data) {
+ node->is_removed = TRUE;
+ }
return;
}
else if (result < 0) {
@@ -566,7 +571,7 @@ wmem_tree_remove_string(wmem_tree_t* tree, const gchar* k, guint32 flags)
{
void *ret = wmem_tree_lookup_string(tree, k, flags);
if (ret) {
- /* Not really a remove, but set data to NULL so the lookup don't find it */
+ /* Not really a remove, but set data to NULL to mark node with is_removed */
wmem_tree_insert_string(tree, k, NULL, flags);
}
return ret;
@@ -669,7 +674,7 @@ wmem_tree_foreach_nodes(wmem_tree_node_t* node, wmem_foreach_func callback,
if (node->is_subtree) {
stop_traverse = wmem_tree_foreach((wmem_tree_t *)node->data,
callback, user_data);
- } else if (node->data) {
+ } else if (!node->is_removed) {
/* No callback for "removed" nodes */
stop_traverse = callback(node->data, user_data);
}