23 RCSID(
"$Id: edabff93dfbad2f9046310a1c74bd841b2e8f524 $")
25 #include <freeradius-devel/libradius.h>
30 #define PTHREAD_MUTEX_LOCK(_x) if (_x->lock) pthread_mutex_lock(&((_x)->mutex))
31 #define PTHREAD_MUTEX_UNLOCK(_x) if (_x->lock) pthread_mutex_unlock(&((_x)->mutex))
33 #define PTHREAD_MUTEX_LOCK(_x)
34 #define PTHREAD_MUTEX_UNLOCK(_x)
65 pthread_mutex_t mutex;
68 #define RBTREE_MAGIC (0x5ad09c42)
75 (void) talloc_get_type_abort(x,
rbnode_t);
102 #ifdef HAVE_PTHREAD_H
116 if (!compare)
return NULL;
119 if (!tree)
return NULL;
127 #ifdef HAVE_PTHREAD_H
133 tree->
free = node_free;
265 current = tree->
root;
267 while (current !=
NIL) {
293 current = (result < 0) ? current->
left : current->
right;
342 if (x == parent->
left) {
409 if (!z || z ==
NIL)
return;
436 if (y == parent->
left) {
461 memcpy(y, z,
sizeof(*y));
500 if (!node)
return false;
516 current = tree->
root;
518 while (current !=
NIL) {
525 current = (result < 0) ?
560 rcode = compare(context, x->
data);
561 if (rcode != 0)
return rcode;
565 if (rcode != 0)
return rcode;
570 if (rcode != 0)
return rcode;
586 if (rcode != 0)
return rcode;
591 rcode = compare(context, x->
data);
592 if (rcode != 0)
return rcode;
596 if (rcode != 0)
return rcode;
612 if (rcode != 0)
return rcode;
617 if (rcode != 0)
return rcode;
620 rcode = compare(context, x->
data);
621 if (rcode != 0)
return rcode;
647 while (solid ==
NIL) {
655 rcode = compare(context, x->
data);
697 if (tree->
root ==
NIL)
return 0;
739 if (!node)
return NULL;
static void free_walker(rbtree_t *tree, rbnode_t *x)
Walks the tree to delete all nodes Does NOT re-balance it!
void rbtree_delete(rbtree_t *tree, rbnode_t *z)
rbnode_t * left
Left child.
void * data
data stored in node
#define pthread_mutex_init(_x, _y)
static void rotate_left(rbtree_t *tree, rbnode_t *x)
Rotate Node x to left.
int(* rb_comparator_t)(void const *ctx, void const *data)
void rbtree_free(rbtree_t *tree)
#define RBTREE_FLAG_REPLACE
static int walk_node_pre_order(rbnode_t *x, rb_walker_t compare, void *context)
Walk the tree, Pre-order.
#define PTHREAD_MUTEX_LOCK(_x)
static void delete_fixup(rbtree_t *tree, rbnode_t *x, rbnode_t *parent)
Maintain RED-BLACK tree balance after deleting node x.
static int walk_node_post_order(rbnode_t *x, rb_walker_t compare, void *context)
rbtree_post_order
static int walk_node_in_order(rbnode_t *x, rb_walker_t compare, void *context)
rbtree_in_order
static void insert_fixup(rbtree_t *tree, rbnode_t *x)
Maintain red-black tree balance after inserting node x.
void * rbtree_node2data(UNUSED rbtree_t *tree, rbnode_t *node)
int rbtree_walk(rbtree_t *tree, rb_order_t order, rb_walker_t compare, void *context)
int(* rb_walker_t)(void *ctx, void *data)
rbtree_t * rbtree_create(TALLOC_CTX *ctx, rb_comparator_t compare, rb_free_t node_free, int flags)
Create a new RED-BLACK tree.
void * rbtree_finddata(rbtree_t *tree, void const *data)
Find the user data.
uint32_t rbtree_num_elements(rbtree_t *tree)
void(* rb_free_t)(void *data)
rbnode_t * rbtree_find(rbtree_t *tree, void const *data)
Find an element in the tree, returning the data, not the node.
void fr_strerror_printf(char const *,...) CC_HINT(format(printf
rbnode_t * right
Right child.
static void rotate_right(rbtree_t *tree, rbnode_t *x)
Rotate Node x to right.
node_colour_t colour
Node colour (BLACK, RED)
static void rbtree_delete_internal(rbtree_t *tree, rbnode_t *z, bool skiplock)
Delete an element (z) from the tree.
#define pthread_mutex_destroy(_x)
#define PTHREAD_MUTEX_UNLOCK(_x)
static int walk_delete_order(rbtree_t *tree, rb_walker_t compare, void *context)
rbtree_delete_order
bool rbtree_insert(rbtree_t *tree, void *data)
bool rbtree_deletebydata(rbtree_t *tree, void const *data)
Delete a node from the tree, based on given data, which MUST have come from rbtree_finddata().
rbnode_t * rbtree_insert_node(rbtree_t *tree, void *data)
Insert an element into the tree.