diff options
author | Stig Bjørlykke <stig@bjorlykke.org> | 2015-08-11 16:11:46 +0200 |
---|---|---|
committer | Stig Bjørlykke <stig@bjorlykke.org> | 2015-08-11 14:15:49 +0000 |
commit | d6c6b0899d46c2592388c8830fc7a6e0e1e2ae8a (patch) | |
tree | fed54d7a05e850db289ece4143088d7947de56da | |
parent | ecc4f756bdb6175cc0b3b11af2f90884db1c602c (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.c | 9 |
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); } |