]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
simplify deletebydata
authorAlan T. DeKok <aland@freeradius.org>
Wed, 17 Jul 2024 17:36:57 +0000 (13:36 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 17 Jul 2024 17:36:57 +0000 (13:36 -0400)
so that it doesn't do multiple lock / unlock cycles

src/lib/rbtree.c

index 1bd45649efd6f8faa42351c2d61a607ff0324264..835dc04293154d82445d1a9cbcf5d8b70e4c7a05 100644 (file)
@@ -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.
  *
  */