From: Alan T. DeKok Date: Wed, 17 Jul 2024 17:36:57 +0000 (-0400) Subject: simplify deletebydata X-Git-Tag: release_3_2_6~48 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ef46ce854371688aed14f9d5b268e704615f63f6;p=thirdparty%2Ffreeradius-server.git simplify deletebydata so that it doesn't do multiple lock / unlock cycles --- diff --git a/src/lib/rbtree.c b/src/lib/rbtree.c index 1bd45649efd..835dc042931 100644 --- a/src/lib/rbtree.c +++ b/src/lib/rbtree.c @@ -491,30 +491,13 @@ void rbtree_delete(rbtree_t *tree, rbnode_t *z) { rbtree_delete_internal(tree, z, false); } -/** Delete a node from the tree, based on given data, which MUST have come from rbtree_finddata(). - * - * - */ -bool rbtree_deletebydata(rbtree_t *tree, void const *data) -{ - rbnode_t *node = rbtree_find(tree, data); - - if (!node) return false; - - rbtree_delete(tree, node); - - return true; -} - - /** Find an element in the tree, returning the data, not the node * */ -rbnode_t *rbtree_find(rbtree_t *tree, void const *data) +static rbnode_t *rbtree_find_internal(rbtree_t *tree, void const *data) { rbnode_t *current; - PTHREAD_MUTEX_LOCK(tree); current = tree->root; while (current != NIL) { @@ -533,6 +516,39 @@ rbnode_t *rbtree_find(rbtree_t *tree, void const *data) return NULL; } +rbnode_t *rbtree_find(rbtree_t *tree, void const *data) +{ + rbnode_t *node; + + PTHREAD_MUTEX_LOCK(tree); + node = rbtree_find_internal(tree, data); + PTHREAD_MUTEX_UNLOCK(tree); + + return node; +} + +/** Delete a node from the tree, based on given data, which MUST have come from rbtree_finddata(). + * + * + */ +bool rbtree_deletebydata(rbtree_t *tree, void const *data) +{ + rbnode_t *node; + + PTHREAD_MUTEX_LOCK(tree); + node = rbtree_find(tree, data); + if (!node) { + PTHREAD_MUTEX_UNLOCK(tree); + return false; + } + + rbtree_delete_internal(tree, node, false); + PTHREAD_MUTEX_UNLOCK(tree); + + return true; +} + + /** Find the user data. * */