X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Frbtree%2Frbtree.c;h=56fa3f155c7e87c1ee83c067c00cf4685bf798ee;hp=753935b3dcc73647b065df9a28cd1716416505d6;hb=18fe5ef012a96014b9e61e48616e682b4a5708a2;hpb=90768177537d783a157c06f79d5919430b563463 diff --git a/ccan/rbtree/rbtree.c b/ccan/rbtree/rbtree.c index 753935b3..56fa3f15 100644 --- a/ccan/rbtree/rbtree.c +++ b/ccan/rbtree/rbtree.c @@ -19,16 +19,16 @@ #include static void -tree_destructor_traverse_node(TALLOC_CTX *mem_ctx, trbt_node_t *node) +tree_destructor_traverse_node(trbt_node_t *node) { talloc_set_destructor(node, NULL); if (node->left) { - tree_destructor_traverse_node(mem_ctx, node->left); + tree_destructor_traverse_node(node->left); } if (node->right) { - tree_destructor_traverse_node(mem_ctx, node->right); + tree_destructor_traverse_node(node->right); } - talloc_steal(mem_ctx, node); + talloc_free(node); } /* @@ -36,7 +36,6 @@ tree_destructor_traverse_node(TALLOC_CTX *mem_ctx, trbt_node_t *node) */ static int tree_destructor(trbt_tree_t *tree) { - TALLOC_CTX *tmp_ctx; trbt_node_t *node; if (tree == NULL) { @@ -48,17 +47,14 @@ static int tree_destructor(trbt_tree_t *tree) return 0; } - /* traverse the tree and remove the node destructor and steal - the node to the temporary context. - we dont want to use the existing destructor for the node + /* traverse the tree and remove the node destructor then delete it. + we don't want to use the existing destructor for the node since that will remove the nodes one by one from the tree. - since the entire tree will be completely destroyed we dont care + since the entire tree will be completely destroyed we don't care if it is inconsistent or unbalanced while freeing the individual nodes */ - tmp_ctx = talloc_new(NULL); - tree_destructor_traverse_node(tmp_ctx, node); - talloc_free(tmp_ctx); + tree_destructor_traverse_node(node); return 0; } @@ -493,7 +489,7 @@ delete_node(trbt_node_t *node) Once the delete of the node is finished, we remove this dummy node, which is simple to do since it is guaranteed that it will still not have any children after the delete operation. - This is because we dont represent the leaf-nodes as actual nodes + This is because we don't represent the leaf-nodes as actual nodes in this implementation. */ if (!child) { @@ -532,7 +528,7 @@ delete_node(trbt_node_t *node) This is simple since this dummy node originally had no children and we are guaranteed that it will also not have any children after the node has been deleted and any possible rotations - have occured. + have occurred. The only special case is if this was the last node of the tree in which case we have to reset the root to NULL as well. @@ -675,6 +671,8 @@ trbt_insert32(trbt_tree_t *tree, uint32_t key, void *data) trbt_node_t *new_node; new_node = trbt_create_node(tree, node, key, data); + if (!new_node) + return NULL; node->left=new_node; node=new_node; @@ -689,6 +687,8 @@ trbt_insert32(trbt_tree_t *tree, uint32_t key, void *data) trbt_node_t *new_node; new_node = trbt_create_node(tree, node, key, data); + if (!new_node) + return NULL; node->right=new_node; node=new_node; break;