2e3a73eaae9dfe4f62495dcf8204f636fa58ecaf
[asterisk/asterisk.git] / main / astobj2_rbtree.c
1 /*
2  * astobj2_hash - RBTree implementation for astobj2.
3  *
4  * Copyright (C) 2006 Marta Carbone, Luigi Rizzo - Univ. di Pisa, Italy
5  *
6  * See http://www.asterisk.org for more information about
7  * the Asterisk project. Please do not directly contact
8  * any of the maintainers of this project for assistance;
9  * the project provides a web site, mailing lists and IRC
10  * channels for your use.
11  *
12  * This program is free software, distributed under the terms of
13  * the GNU General Public License Version 2. See the LICENSE file
14  * at the top of the source tree.
15  */
16
17 /*! \file
18  *
19  * \brief RBTree functions implementing astobj2 containers.
20  *
21  * \author Richard Mudgett <rmudgett@digium.com>
22  */
23
24 #include "asterisk.h"
25
26 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
27
28 #include "asterisk/_private.h"
29 #include "asterisk/astobj2.h"
30 #include "asterisk/utils.h"
31 #include "astobj2_private.h"
32 #include "astobj2_container_private.h"
33
34 /*!
35  * A structure to hold the object held by the container and
36  * where it is located in it.
37  *
38  * A red-black tree has the following properties:
39  *
40  * 1) Every node is either black or red.
41  *
42  * 2) The root is black.
43  *
44  * 3) If a node has a NULL child, that "child" is considered
45  * black.
46  *
47  * 4) If a node is red, then both of its children are black.
48  *
49  * 5) Every path from a node to a descendant NULL child has the
50  * same number of black nodes.  (Including the black NULL
51  * child.)
52  */
53 struct rbtree_node {
54         /*!
55          * \brief Items common to all container nodes.
56          * \note Must be first in the specific node struct.
57          */
58         struct ao2_container_node common;
59         /*! Parent node of this node. NULL if this is the root node. */
60         struct rbtree_node *parent;
61         /*! Left child node of this node.  NULL if does not have this child. */
62         struct rbtree_node *left;
63         /*! Right child node of this node.  NULL if does not have this child. */
64         struct rbtree_node *right;
65         /*! TRUE if the node is red. */
66         unsigned int is_red:1;
67 };
68
69 /*!
70  * A rbtree container in addition to values common to all
71  * container types, stores the pointer to the root node of the
72  * tree.
73  */
74 struct ao2_container_rbtree {
75         /*!
76          * \brief Items common to all containers.
77          * \note Must be first in the specific container struct.
78          */
79         struct ao2_container common;
80         /*! Root node of the tree.  NULL if the tree is empty. */
81         struct rbtree_node *root;
82 #if defined(AO2_DEBUG)
83         struct {
84                 /*! Fixup insert left cases 1-3 */
85                 int fixup_insert_left[3];
86                 /*! Fixup insert right cases 1-3 */
87                 int fixup_insert_right[3];
88                 /*! Fixup delete left cases 1-4 */
89                 int fixup_delete_left[4];
90                 /*! Fixup delete right cases 1-4 */
91                 int fixup_delete_right[4];
92                 /*! Deletion of node with number of children (0-2). */
93                 int delete_children[3];
94         } stats;
95 #endif  /* defined(AO2_DEBUG) */
96 };
97
98 enum equal_node_bias {
99         /*! Bias search toward first matching node in the container. */
100         BIAS_FIRST,
101         /*! Bias search toward any matching node. */
102         BIAS_EQUAL,
103         /*! Bias search toward last matching node in the container. */
104         BIAS_LAST,
105 };
106
107 enum empty_node_direction {
108         GO_LEFT,
109         GO_RIGHT,
110 };
111
112 /*! Traversal state to restart a rbtree container traversal. */
113 struct rbtree_traversal_state {
114         /*! Active sort function in the traversal if not NULL. */
115         ao2_sort_fn *sort_fn;
116         /*! Saved comparison callback arg pointer. */
117         void *arg;
118         /*! Saved search flags to control traversing the container. */
119         enum search_flags flags;
120 };
121
122 struct rbtree_traversal_state_check {
123         /*
124          * If we have a division by zero compile error here then there
125          * is not enough room for the state.  Increase AO2_TRAVERSAL_STATE_SIZE.
126          */
127         char check[1 / (AO2_TRAVERSAL_STATE_SIZE / sizeof(struct rbtree_traversal_state))];
128 };
129
130 /*!
131  * \internal
132  * \brief Get the most left node in the tree.
133  * \since 12.0.0
134  *
135  * \param node Starting node to find the most left node.
136  *
137  * \return Left most node.  Never NULL.
138  */
139 static struct rbtree_node *rb_node_most_left(struct rbtree_node *node)
140 {
141         while (node->left) {
142                 node = node->left;
143         }
144
145         return node;
146 }
147
148 /*!
149  * \internal
150  * \brief Get the most right node in the tree.
151  * \since 12.0.0
152  *
153  * \param node Starting node to find the most right node.
154  *
155  * \return Right most node.  Never NULL.
156  */
157 static struct rbtree_node *rb_node_most_right(struct rbtree_node *node)
158 {
159         while (node->right) {
160                 node = node->right;
161         }
162
163         return node;
164 }
165
166 /*!
167  * \internal
168  * \brief Get the next node in ascending sequence.
169  * \since 12.0.0
170  *
171  * \param node Starting node to find the next node.
172  *
173  * \retval node on success.
174  * \retval NULL if no node.
175  */
176 static struct rbtree_node *rb_node_next(struct rbtree_node *node)
177 {
178         if (node->right) {
179                 return rb_node_most_left(node->right);
180         }
181
182         /* Find the parent that the node is a left child of. */
183         while (node->parent) {
184                 if (node->parent->left == node) {
185                         /* We are the left child.  The parent is the next node. */
186                         return node->parent;
187                 }
188                 node = node->parent;
189         }
190         return NULL;
191 }
192
193 /*!
194  * \internal
195  * \brief Get the next node in descending sequence.
196  * \since 12.0.0
197  *
198  * \param node Starting node to find the previous node.
199  *
200  * \retval node on success.
201  * \retval NULL if no node.
202  */
203 static struct rbtree_node *rb_node_prev(struct rbtree_node *node)
204 {
205         if (node->left) {
206                 return rb_node_most_right(node->left);
207         }
208
209         /* Find the parent that the node is a right child of. */
210         while (node->parent) {
211                 if (node->parent->right == node) {
212                         /* We are the right child.  The parent is the previous node. */
213                         return node->parent;
214                 }
215                 node = node->parent;
216         }
217         return NULL;
218 }
219
220 /*!
221  * \internal
222  * \brief Get the next node in pre-order sequence.
223  * \since 12.0.0
224  *
225  * \param node Starting node to find the next node.
226  *
227  * \retval node on success.
228  * \retval NULL if no node.
229  */
230 static struct rbtree_node *rb_node_pre(struct rbtree_node *node)
231 {
232         /* Visit the children if the node has any. */
233         if (node->left) {
234                 return node->left;
235         }
236         if (node->right) {
237                 return node->right;
238         }
239
240         /* Time to go back up. */
241         for (;;) {
242                 if (!node->parent) {
243                         return NULL;
244                 }
245                 if (node->parent->left == node && node->parent->right) {
246                         /*
247                          * We came up the left child and there's a right child.  Visit
248                          * it.
249                          */
250                         return node->parent->right;
251                 }
252                 node = node->parent;
253         }
254 }
255
256 /*!
257  * \internal
258  * \brief Get the next node in post-order sequence.
259  * \since 12.0.0
260  *
261  * \param node Starting node to find the next node.
262  *
263  * \retval node on success.
264  * \retval NULL if no node.
265  */
266 static struct rbtree_node *rb_node_post(struct rbtree_node *node)
267 {
268         /* This node's children have already been visited. */
269         for (;;) {
270                 if (!node->parent) {
271                         return NULL;
272                 }
273                 if (node->parent->left == node) {
274                         /* We came up the left child. */
275                         node = node->parent;
276
277                         /*
278                          * Find the right child's left most childless node.
279                          */
280                         while (node->right) {
281                                 node = rb_node_most_left(node->right);
282                         }
283
284                         /*
285                          * This node's left child has already been visited or it doesn't
286                          * have any children.
287                          */
288                         return node;
289                 }
290
291                 /*
292                  * We came up the right child.
293                  *
294                  * This node's children have already been visited.  Time to
295                  * visit the parent.
296                  */
297                 return node->parent;
298         }
299 }
300
301 /*!
302  * \internal
303  * \brief Get the next non-empty node in ascending sequence.
304  * \since 12.0.0
305  *
306  * \param node Starting node to find the next node.
307  *
308  * \retval node on success.
309  * \retval NULL if no node.
310  */
311 static struct rbtree_node *rb_node_next_full(struct rbtree_node *node)
312 {
313         for (;;) {
314                 node = rb_node_next(node);
315                 if (!node || node->common.obj) {
316                         return node;
317                 }
318         }
319 }
320
321 /*!
322  * \internal
323  * \brief Get the next non-empty node in descending sequence.
324  * \since 12.0.0
325  *
326  * \param node Starting node to find the previous node.
327  *
328  * \retval node on success.
329  * \retval NULL if no node.
330  */
331 static struct rbtree_node *rb_node_prev_full(struct rbtree_node *node)
332 {
333         for (;;) {
334                 node = rb_node_prev(node);
335                 if (!node || node->common.obj) {
336                         return node;
337                 }
338         }
339 }
340
341 /*!
342  * \internal
343  * \brief Determine which way to go from an empty node.
344  * \since 12.0.0
345  *
346  * \param empty Empty node to determine which side obj_right goes on.
347  * \param sort_fn Sort comparison function for non-empty nodes.
348  * \param obj_right pointer to the (user-defined part) of an object.
349  * \param flags flags from ao2_callback()
350  *   OBJ_SEARCH_OBJECT - if set, 'obj_right', is an object.
351  *   OBJ_SEARCH_KEY - if set, 'obj_right', is a search key item that is not an object.
352  *   OBJ_SEARCH_PARTIAL_KEY - if set, 'obj_right', is a partial search key item that is not an object.
353  * \param bias How to bias search direction for duplicates
354  *
355  * \return enum empty_node_direction to proceed.
356  */
357 static enum empty_node_direction rb_find_empty_direction(struct rbtree_node *empty, ao2_sort_fn *sort_fn, void *obj_right, enum search_flags flags, enum equal_node_bias bias)
358 {
359         int cmp;
360         struct rbtree_node *cur;
361         struct rbtree_node *right_most;
362
363         /* Try for a quick definite go left. */
364         if (!empty->left) {
365                 /* The empty node has no left child. */
366                 return GO_RIGHT;
367         }
368         right_most = rb_node_most_right(empty->left);
369         if (right_most->common.obj) {
370                 cmp = sort_fn(right_most->common.obj, obj_right, flags);
371                 if (cmp < 0) {
372                         return GO_RIGHT;
373                 }
374                 if (cmp == 0 && bias == BIAS_LAST) {
375                         return GO_RIGHT;
376                 }
377                 return GO_LEFT;
378         }
379
380         /* Try for a quick definite go right. */
381         if (!empty->right) {
382                 /* The empty node has no right child. */
383                 return GO_LEFT;
384         }
385         cur = rb_node_most_left(empty->right);
386         if (cur->common.obj) {
387                 cmp = sort_fn(cur->common.obj, obj_right, flags);
388                 if (cmp > 0) {
389                         return GO_LEFT;
390                 }
391                 if (cmp == 0 && bias == BIAS_FIRST) {
392                         return GO_LEFT;
393                 }
394                 return GO_RIGHT;
395         }
396
397         /*
398          * Have to scan the previous nodes from the right_most node of
399          * the left subtree for the first non-empty node to determine
400          * direction.
401          */
402         cur = right_most;
403         for (;;) {
404                 /* Find previous node. */
405                 if (cur->left) {
406                         cur = rb_node_most_right(cur->left);
407                 } else {
408                         /* Find the parent that the node is a right child of. */
409                         for (;;) {
410                                 if (cur->parent == empty) {
411                                         /* The left side of the empty node is all empty nodes. */
412                                         return GO_RIGHT;
413                                 }
414                                 if (cur->parent->right == cur) {
415                                         /* We are the right child.  The parent is the previous node. */
416                                         cur = cur->parent;
417                                         break;
418                                 }
419                                 cur = cur->parent;
420                         }
421                 }
422
423                 if (cur->common.obj) {
424                         cmp = sort_fn(cur->common.obj, obj_right, flags);
425                         if (cmp < 0) {
426                                 return GO_RIGHT;
427                         }
428                         if (cmp == 0 && bias == BIAS_LAST) {
429                                 return GO_RIGHT;
430                         }
431                         return GO_LEFT;
432                 }
433         }
434 }
435
436 /*!
437  * \internal
438  * \brief Tree node rotation left.
439  * \since 12.0.0
440  *
441  * \param self Container holding node.
442  * \param node Node to perform a left rotation with.
443  *
444  *        p                         p
445  *        |     Left rotation       |
446  *        N        --->             Ch
447  *       / \                       / \
448  *      a  Ch                     N   c
449  *        / \                    / \
450  *       b   c                  a   b
451  *
452  * N = node
453  * Ch = child
454  * p = parent
455  * a,b,c = other nodes that are unaffected by the rotation.
456  *
457  * \note It is assumed that the node's right child exists.
458  *
459  * \return Nothing
460  */
461 static void rb_rotate_left(struct ao2_container_rbtree *self, struct rbtree_node *node)
462 {
463         struct rbtree_node *child;      /*!< Node's right child. */
464
465         child = node->right;
466
467         /* Link the node's parent to the child. */
468         if (!node->parent) {
469                 /* Node is the root so we get a new root node. */
470                 self->root = child;
471         } else if (node->parent->left == node) {
472                 /* Node is a left child. */
473                 node->parent->left = child;
474         } else {
475                 /* Node is a right child. */
476                 node->parent->right = child;
477         }
478         child->parent = node->parent;
479
480         /* Link node's right subtree to the child's left subtree. */
481         node->right = child->left;
482         if (node->right) {
483                 node->right->parent = node;
484         }
485
486         /* Link the node to the child's left. */
487         node->parent = child;
488         child->left = node;
489 }
490
491 /*!
492  * \internal
493  * \brief Tree node rotation right.
494  * \since 12.0.0
495  *
496  * \param self Container holding node.
497  * \param node Node to perform a right rotation with.
498  *
499  *        p                         p
500  *        |     Right rotation      |
501  *        Ch                        N
502  *       / \       <---            / \
503  *      a  N                      Ch  c
504  *        / \                    / \
505  *       b   c                  a   b
506  *
507  * N = node
508  * Ch = child
509  * p = parent
510  * a,b,c = other nodes that are unaffected by the rotation.
511  *
512  * \note It is assumed that the node's left child exists.
513  *
514  * \return Nothing
515  */
516 static void rb_rotate_right(struct ao2_container_rbtree *self, struct rbtree_node *node)
517 {
518         struct rbtree_node *child;      /*!< Node's left child. */
519
520         child = node->left;
521
522         /* Link the node's parent to the child. */
523         if (!node->parent) {
524                 /* Node is the root so we get a new root node. */
525                 self->root = child;
526         } else if (node->parent->right == node) {
527                 /* Node is a right child. */
528                 node->parent->right = child;
529         } else {
530                 /* Node is a left child. */
531                 node->parent->left = child;
532         }
533         child->parent = node->parent;
534
535         /* Link node's left subtree to the child's right subtree. */
536         node->left = child->right;
537         if (node->left) {
538                 node->left->parent = node;
539         }
540
541         /* Link the node to the child's right. */
542         node->parent = child;
543         child->right = node;
544 }
545
546 /*!
547  * \internal
548  * \brief Create an empty copy of this container.
549  * \since 12.0.0
550  *
551  * \param self Container to operate upon.
552  *
553  * \retval empty-clone-container on success.
554  * \retval NULL on error.
555  */
556 static struct ao2_container *rb_ao2_alloc_empty_clone(struct ao2_container_rbtree *self)
557 {
558         if (!is_ao2_object(self)) {
559                 return NULL;
560         }
561
562         return ao2_t_container_alloc_rbtree(ao2_options_get(self), self->common.options,
563                 self->common.sort_fn, self->common.cmp_fn, "Clone rbtree container");
564 }
565
566 /*!
567  * \internal
568  * \brief Create an empty copy of this container. (Debug version)
569  * \since 12.0.0
570  *
571  * \param self Container to operate upon.
572  * \param tag used for debugging.
573  * \param file Debug file name invoked from
574  * \param line Debug line invoked from
575  * \param func Debug function name invoked from
576  * \param ref_debug TRUE if to output a debug reference message.
577  *
578  * \retval empty-clone-container on success.
579  * \retval NULL on error.
580  */
581 static struct ao2_container *rb_ao2_alloc_empty_clone_debug(struct ao2_container_rbtree *self, const char *tag, const char *file, int line, const char *func, int ref_debug)
582 {
583         if (!is_ao2_object(self)) {
584                 return NULL;
585         }
586
587         return __ao2_container_alloc_rbtree_debug(ao2_options_get(self), self->common.options,
588                 self->common.sort_fn, self->common.cmp_fn, tag, file, line, func, ref_debug);
589 }
590
591 /*!
592  * \internal
593  * \brief Fixup the rbtree after deleting a node.
594  * \since 12.0.0
595  *
596  * \param self Container to operate upon.
597  * \param child Child of the node just deleted from the container.
598  *
599  * \note The child must be a dummy black node if there really
600  * was no child of the deleted node.  Otherwise, the caller must
601  * pass in the parent node and which child was deleted.  In
602  * addition, the fixup routine would be more complicated.
603  *
604  * \return Nothing
605  */
606 static void rb_delete_fixup(struct ao2_container_rbtree *self, struct rbtree_node *child)
607 {
608         struct rbtree_node *sibling;
609
610         while (self->root != child && !child->is_red) {
611                 if (child->parent->left == child) {
612                         /* Child is a left child. */
613                         sibling = child->parent->right;
614                         ast_assert(sibling != NULL);
615                         if (sibling->is_red) {
616                                 /* Case 1: The child's sibling is red. */
617                                 AO2_DEVMODE_STAT(++self->stats.fixup_delete_left[0]);
618                                 sibling->is_red = 0;
619                                 child->parent->is_red = 1;
620                                 rb_rotate_left(self, child->parent);
621                                 sibling = child->parent->right;
622                                 ast_assert(sibling != NULL);
623                         }
624                         /*
625                          * The sibling is black.  A black node must have two children,
626                          * or one red child, or no children.
627                          */
628                         if ((!sibling->left || !sibling->left->is_red)
629                                 && (!sibling->right || !sibling->right->is_red)) {
630                                 /*
631                                  * Case 2: The sibling is black and both of its children are black.
632                                  *
633                                  * This case handles the two black children or no children
634                                  * possibilities of a black node.
635                                  */
636                                 AO2_DEVMODE_STAT(++self->stats.fixup_delete_left[1]);
637                                 sibling->is_red = 1;
638                                 child = child->parent;
639                         } else {
640                                 /* At this point the sibling has at least one red child. */
641                                 if (!sibling->right || !sibling->right->is_red) {
642                                         /*
643                                          * Case 3: The sibling is black, its left child is red, and its
644                                          * right child is black.
645                                          */
646                                         AO2_DEVMODE_STAT(++self->stats.fixup_delete_left[2]);
647                                         ast_assert(sibling->left != NULL);
648                                         ast_assert(sibling->left->is_red);
649                                         sibling->left->is_red = 0;
650                                         sibling->is_red = 1;
651                                         rb_rotate_right(self, sibling);
652                                         sibling = child->parent->right;
653                                         ast_assert(sibling != NULL);
654                                 }
655                                 /* Case 4: The sibling is black and its right child is red. */
656                                 AO2_DEVMODE_STAT(++self->stats.fixup_delete_left[3]);
657                                 sibling->is_red = child->parent->is_red;
658                                 child->parent->is_red = 0;
659                                 if (sibling->right) {
660                                         sibling->right->is_red = 0;
661                                 }
662                                 rb_rotate_left(self, child->parent);
663                                 child = self->root;
664                         }
665                 } else {
666                         /* Child is a right child. */
667                         sibling = child->parent->left;
668                         ast_assert(sibling != NULL);
669                         if (sibling->is_red) {
670                                 /* Case 1: The child's sibling is red. */
671                                 AO2_DEVMODE_STAT(++self->stats.fixup_delete_right[0]);
672                                 sibling->is_red = 0;
673                                 child->parent->is_red = 1;
674                                 rb_rotate_right(self, child->parent);
675                                 sibling = child->parent->left;
676                                 ast_assert(sibling != NULL);
677                         }
678                         /*
679                          * The sibling is black.  A black node must have two children,
680                          * or one red child, or no children.
681                          */
682                         if ((!sibling->right || !sibling->right->is_red)
683                                 && (!sibling->left || !sibling->left->is_red)) {
684                                 /*
685                                  * Case 2: The sibling is black and both of its children are black.
686                                  *
687                                  * This case handles the two black children or no children
688                                  * possibilities of a black node.
689                                  */
690                                 AO2_DEVMODE_STAT(++self->stats.fixup_delete_right[1]);
691                                 sibling->is_red = 1;
692                                 child = child->parent;
693                         } else {
694                                 /* At this point the sibling has at least one red child. */
695                                 if (!sibling->left || !sibling->left->is_red) {
696                                         /*
697                                          * Case 3: The sibling is black, its right child is red, and its
698                                          * left child is black.
699                                          */
700                                         AO2_DEVMODE_STAT(++self->stats.fixup_delete_right[2]);
701                                         ast_assert(sibling->right != NULL);
702                                         ast_assert(sibling->right->is_red);
703                                         sibling->right->is_red = 0;
704                                         sibling->is_red = 1;
705                                         rb_rotate_left(self, sibling);
706                                         sibling = child->parent->left;
707                                         ast_assert(sibling != NULL);
708                                 }
709                                 /* Case 4: The sibling is black and its left child is red. */
710                                 AO2_DEVMODE_STAT(++self->stats.fixup_delete_right[3]);
711                                 sibling->is_red = child->parent->is_red;
712                                 child->parent->is_red = 0;
713                                 if (sibling->left) {
714                                         sibling->left->is_red = 0;
715                                 }
716                                 rb_rotate_right(self, child->parent);
717                                 child = self->root;
718                         }
719                 }
720         }
721
722         /*
723          * Case 2 could leave the child node red and it needs to leave
724          * with it black.
725          *
726          * Case 4 sets the child node to the root which of course must
727          * be black.
728          */
729         child->is_red = 0;
730 }
731
732 /*!
733  * \internal
734  * \brief Delete the doomed node from this container.
735  * \since 12.0.0
736  *
737  * \param self Container to operate upon.
738  * \param doomed Container node to delete from the container.
739  *
740  * \return Nothing
741  */
742 static void rb_delete_node(struct ao2_container_rbtree *self, struct rbtree_node *doomed)
743 {
744         struct rbtree_node *child;
745         int need_fixup;
746
747         if (doomed->left && doomed->right) {
748                 struct rbtree_node *next;
749                 int is_red;
750
751                 /*
752                  * The doomed node has two children.
753                  *
754                  * Find the next child node and swap it with the doomed node in
755                  * the tree.
756                  */
757                 AO2_DEVMODE_STAT(++self->stats.delete_children[2]);
758                 next = rb_node_most_left(doomed->right);
759                 SWAP(doomed->parent, next->parent);
760                 SWAP(doomed->left, next->left);
761                 SWAP(doomed->right, next->right);
762                 is_red = doomed->is_red;
763                 doomed->is_red = next->is_red;
764                 next->is_red = is_red;
765
766                 /* Link back in the next node. */
767                 if (!next->parent) {
768                         /* Doomed was the root so we get a new root node. */
769                         self->root = next;
770                 } else if (next->parent->left == doomed) {
771                         /* Doomed was the left child. */
772                         next->parent->left = next;
773                 } else {
774                         /* Doomed was the right child. */
775                         next->parent->right = next;
776                 }
777                 next->left->parent = next;
778                 if (next->right == next) {
779                         /* The next node was the right child of doomed. */
780                         next->right = doomed;
781                         doomed->parent = next;
782                 } else {
783                         next->right->parent = next;
784                         doomed->parent->left = doomed;
785                 }
786
787                 /* The doomed node has no left child now. */
788                 ast_assert(doomed->left == NULL);
789
790                 /*
791                  * We don't have to link the right child back in with doomed
792                  * since we are going to link it with doomed's parent anyway.
793                  */
794                 child = doomed->right;
795         } else {
796                 /* Doomed has at most one child. */
797                 child = doomed->left;
798                 if (!child) {
799                         child = doomed->right;
800                 }
801         }
802         if (child) {
803                 AO2_DEVMODE_STAT(++self->stats.delete_children[1]);
804         } else {
805                 AO2_DEVMODE_STAT(++self->stats.delete_children[0]);
806         }
807
808         need_fixup = (!doomed->is_red && !self->common.destroying);
809         if (need_fixup && !child) {
810                 /*
811                  * Use the doomed node as a place holder node for the
812                  * nonexistent child so we also don't have to pass to the fixup
813                  * routine the parent and which child the deleted node came
814                  * from.
815                  */
816                 rb_delete_fixup(self, doomed);
817                 ast_assert(doomed->left == NULL);
818                 ast_assert(doomed->right == NULL);
819                 ast_assert(!doomed->is_red);
820         }
821
822         /* Link the child in place of doomed. */
823         if (!doomed->parent) {
824                 /* Doomed was the root so we get a new root node. */
825                 self->root = child;
826         } else if (doomed->parent->left == doomed) {
827                 /* Doomed was the left child. */
828                 doomed->parent->left = child;
829         } else {
830                 /* Doomed was the right child. */
831                 doomed->parent->right = child;
832         }
833         if (child) {
834                 child->parent = doomed->parent;
835                 if (need_fixup) {
836                         rb_delete_fixup(self, child);
837                 }
838         }
839
840         AO2_DEVMODE_STAT(--self->common.nodes);
841 }
842
843 /*!
844  * \internal
845  * \brief Destroy a rbtree container node.
846  * \since 12.0.0
847  *
848  * \param v_doomed Container node to destroy.
849  *
850  * \details
851  * The container node unlinks itself from the container as part
852  * of its destruction.  The node must be destroyed while the
853  * container is already locked.
854  *
855  * \note The container must be locked when the node is
856  * unreferenced.
857  *
858  * \return Nothing
859  */
860 static void rb_ao2_node_destructor(void *v_doomed)
861 {
862         struct rbtree_node *doomed = v_doomed;
863
864         if (doomed->common.is_linked) {
865                 struct ao2_container_rbtree *my_container;
866
867                 /*
868                  * Promote to write lock if not already there.  Since
869                  * adjust_lock() can potentially release and block waiting for a
870                  * write lock, care must be taken to ensure that node references
871                  * are released before releasing the container references.
872                  *
873                  * Node references held by an iterator can only be held while
874                  * the iterator also holds a reference to the container.  These
875                  * node references must be unreferenced before the container can
876                  * be unreferenced to ensure that the node will not get a
877                  * negative reference and the destructor called twice for the
878                  * same node.
879                  */
880                 my_container = (struct ao2_container_rbtree *) doomed->common.my_container;
881                 __adjust_lock(my_container, AO2_LOCK_REQ_WRLOCK, 1);
882
883 #if defined(AO2_DEBUG)
884                 if (!my_container->common.destroying
885                         && ao2_container_check(doomed->common.my_container, OBJ_NOLOCK)) {
886                         ast_log(LOG_ERROR, "Container integrity failed before node deletion.\n");
887                 }
888 #endif  /* defined(AO2_DEBUG) */
889                 rb_delete_node(my_container, doomed);
890 #if defined(AO2_DEBUG)
891                 if (!my_container->common.destroying
892                         && ao2_container_check(doomed->common.my_container, OBJ_NOLOCK)) {
893                         ast_log(LOG_ERROR, "Container integrity failed after node deletion.\n");
894                 }
895 #endif  /* defined(AO2_DEBUG) */
896         }
897
898         /*
899          * We could have an object in the node if the container is being
900          * destroyed or the node had not been linked in yet.
901          */
902         if (doomed->common.obj) {
903                 __container_unlink_node(&doomed->common, AO2_UNLINK_NODE_UNLINK_OBJECT);
904         }
905 }
906
907 /*!
908  * \internal
909  * \brief Create a new container node.
910  * \since 12.0.0
911  *
912  * \param self Container to operate upon.
913  * \param obj_new Object to put into the node.
914  * \param tag used for debugging.
915  * \param file Debug file name invoked from
916  * \param line Debug line invoked from
917  * \param func Debug function name invoked from
918  *
919  * \retval initialized-node on success.
920  * \retval NULL on error.
921  */
922 static struct rbtree_node *rb_ao2_new_node(struct ao2_container_rbtree *self, void *obj_new, const char *tag, const char *file, int line, const char *func)
923 {
924         struct rbtree_node *node;
925
926         node = __ao2_alloc(sizeof(*node), rb_ao2_node_destructor, AO2_ALLOC_OPT_LOCK_NOLOCK);
927         if (!node) {
928                 return NULL;
929         }
930
931         if (tag) {
932                 __ao2_ref_debug(obj_new, +1, tag, file, line, func);
933         } else {
934                 ao2_t_ref(obj_new, +1, "Container node creation");
935         }
936         node->common.obj = obj_new;
937         node->common.my_container = (struct ao2_container *) self;
938
939         return node;
940 }
941
942 /*!
943  * \internal
944  * \brief Fixup the rbtree after inserting a node.
945  * \since 12.0.0
946  *
947  * \param self Container to operate upon.
948  * \param node Container node just inserted into the container.
949  *
950  * \note The just inserted node is red.
951  *
952  * \return Nothing
953  */
954 static void rb_insert_fixup(struct ao2_container_rbtree *self, struct rbtree_node *node)
955 {
956         struct rbtree_node *g_parent;   /* Grand parent node. */
957
958         while (node->parent && node->parent->is_red) {
959                 g_parent = node->parent->parent;
960
961                 /* The grand parent must exist if the parent is red. */
962                 ast_assert(g_parent != NULL);
963
964                 if (node->parent == g_parent->left) {
965                         /* The parent is a left child. */
966                         if (g_parent->right && g_parent->right->is_red) {
967                                 /* Case 1: Push the black down from the grand parent node. */
968                                 AO2_DEVMODE_STAT(++self->stats.fixup_insert_left[0]);
969                                 g_parent->right->is_red = 0;
970                                 g_parent->left->is_red = 0;
971                                 g_parent->is_red = 1;
972
973                                 node = g_parent;
974                         } else {
975                                 /* The uncle node is black. */
976                                 if (node->parent->right == node) {
977                                         /*
978                                          * Case 2: The node is a right child.
979                                          *
980                                          * Which node is the grand parent does not change.
981                                          */
982                                         AO2_DEVMODE_STAT(++self->stats.fixup_insert_left[1]);
983                                         node = node->parent;
984                                         rb_rotate_left(self, node);
985                                 }
986                                 /* Case 3: The node is a left child. */
987                                 AO2_DEVMODE_STAT(++self->stats.fixup_insert_left[2]);
988                                 node->parent->is_red = 0;
989                                 g_parent->is_red = 1;
990                                 rb_rotate_right(self, g_parent);
991                         }
992                 } else {
993                         /* The parent is a right child. */
994                         if (g_parent->left && g_parent->left->is_red) {
995                                 /* Case 1: Push the black down from the grand parent node. */
996                                 AO2_DEVMODE_STAT(++self->stats.fixup_insert_right[0]);
997                                 g_parent->left->is_red = 0;
998                                 g_parent->right->is_red = 0;
999                                 g_parent->is_red = 1;
1000
1001                                 node = g_parent;
1002                         } else {
1003                                 /* The uncle node is black. */
1004                                 if (node->parent->left == node) {
1005                                         /*
1006                                          * Case 2: The node is a left child.
1007                                          *
1008                                          * Which node is the grand parent does not change.
1009                                          */
1010                                         AO2_DEVMODE_STAT(++self->stats.fixup_insert_right[1]);
1011                                         node = node->parent;
1012                                         rb_rotate_right(self, node);
1013                                 }
1014                                 /* Case 3: The node is a right child. */
1015                                 AO2_DEVMODE_STAT(++self->stats.fixup_insert_right[2]);
1016                                 node->parent->is_red = 0;
1017                                 g_parent->is_red = 1;
1018                                 rb_rotate_left(self, g_parent);
1019                         }
1020                 }
1021         }
1022
1023         /*
1024          * The root could be red here because:
1025          * 1) We just inserted the root node in an empty tree.
1026          *
1027          * 2) Case 1 could leave the root red if the grand parent were
1028          * the root.
1029          */
1030         self->root->is_red = 0;
1031 }
1032
1033 /*!
1034  * \internal
1035  * \brief Insert a node into this container.
1036  * \since 12.0.0
1037  *
1038  * \param self Container to operate upon.
1039  * \param node Container node to insert into the container.
1040  *
1041  * \return enum ao2_container_insert value.
1042  */
1043 static enum ao2_container_insert rb_ao2_insert_node(struct ao2_container_rbtree *self, struct rbtree_node *node)
1044 {
1045         int cmp;
1046         struct rbtree_node *cur;
1047         struct rbtree_node *next;
1048         ao2_sort_fn *sort_fn;
1049         uint32_t options;
1050         enum equal_node_bias bias;
1051
1052         if (!self->root) {
1053                 /* The tree is empty. */
1054                 self->root = node;
1055                 return AO2_CONTAINER_INSERT_NODE_INSERTED;
1056         }
1057
1058         sort_fn = self->common.sort_fn;
1059         options = self->common.options;
1060         switch (options & AO2_CONTAINER_ALLOC_OPT_DUPS_MASK) {
1061         default:
1062         case AO2_CONTAINER_ALLOC_OPT_DUPS_ALLOW:
1063                 if (options & AO2_CONTAINER_ALLOC_OPT_INSERT_BEGIN) {
1064                         bias = BIAS_FIRST;
1065                 } else {
1066                         bias = BIAS_LAST;
1067                 }
1068                 break;
1069         case AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT:
1070         case AO2_CONTAINER_ALLOC_OPT_DUPS_OBJ_REJECT:
1071         case AO2_CONTAINER_ALLOC_OPT_DUPS_REPLACE:
1072                 bias = BIAS_EQUAL;
1073                 break;
1074         }
1075
1076         /*
1077          * New nodes are always colored red when initially inserted into
1078          * the tree.  (Except for the root which is always black.)
1079          */
1080         node->is_red = 1;
1081
1082         /* Find node where normal insert would put a new node. */
1083         cur = self->root;
1084         for (;;) {
1085                 if (!cur->common.obj) {
1086                         /* Which direction do we go to insert this node? */
1087                         if (rb_find_empty_direction(cur, sort_fn, node->common.obj, OBJ_SEARCH_OBJECT, bias)
1088                                 == GO_LEFT) {
1089                                 if (cur->left) {
1090                                         cur = cur->left;
1091                                         continue;
1092                                 }
1093
1094                                 /* Node becomes a left child */
1095                                 cur->left = node;
1096                                 node->parent = cur;
1097                                 rb_insert_fixup(self, node);
1098                                 return AO2_CONTAINER_INSERT_NODE_INSERTED;
1099                         }
1100                         if (cur->right) {
1101                                 cur = cur->right;
1102                                 continue;
1103                         }
1104
1105                         /* Node becomes a right child */
1106                         cur->right = node;
1107                         node->parent = cur;
1108                         rb_insert_fixup(self, node);
1109                         return AO2_CONTAINER_INSERT_NODE_INSERTED;
1110                 }
1111                 cmp = sort_fn(cur->common.obj, node->common.obj, OBJ_SEARCH_OBJECT);
1112                 if (cmp > 0) {
1113                         if (cur->left) {
1114                                 cur = cur->left;
1115                                 continue;
1116                         }
1117
1118                         /* Node becomes a left child */
1119                         cur->left = node;
1120                         node->parent = cur;
1121                         rb_insert_fixup(self, node);
1122                         return AO2_CONTAINER_INSERT_NODE_INSERTED;
1123                 } else if (cmp < 0) {
1124                         if (cur->right) {
1125                                 cur = cur->right;
1126                                 continue;
1127                         }
1128
1129                         /* Node becomes a right child */
1130                         cur->right = node;
1131                         node->parent = cur;
1132                         rb_insert_fixup(self, node);
1133                         return AO2_CONTAINER_INSERT_NODE_INSERTED;
1134                 }
1135                 switch (bias) {
1136                 case BIAS_FIRST:
1137                         /* Duplicate nodes unconditionally accepted. */
1138                         if (cur->left) {
1139                                 cur = cur->left;
1140                                 continue;
1141                         }
1142
1143                         /* Node becomes a left child */
1144                         cur->left = node;
1145                         node->parent = cur;
1146                         rb_insert_fixup(self, node);
1147                         return AO2_CONTAINER_INSERT_NODE_INSERTED;
1148                 case BIAS_EQUAL:
1149                         break;
1150                 case BIAS_LAST:
1151                         /* Duplicate nodes unconditionally accepted. */
1152                         if (cur->right) {
1153                                 cur = cur->right;
1154                                 continue;
1155                         }
1156
1157                         /* Node becomes a right child */
1158                         cur->right = node;
1159                         node->parent = cur;
1160                         rb_insert_fixup(self, node);
1161                         return AO2_CONTAINER_INSERT_NODE_INSERTED;
1162                 }
1163
1164                 break;
1165         }
1166
1167         /* Node is a dupliate */
1168         switch (options & AO2_CONTAINER_ALLOC_OPT_DUPS_MASK) {
1169         default:
1170         case AO2_CONTAINER_ALLOC_OPT_DUPS_ALLOW:
1171                 ast_assert(0);/* Case already handled by BIAS_FIRST/BIAS_LAST. */
1172                 return AO2_CONTAINER_INSERT_NODE_REJECTED;
1173         case AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT:
1174                 /* Reject all objects with the same key. */
1175                 return AO2_CONTAINER_INSERT_NODE_REJECTED;
1176         case AO2_CONTAINER_ALLOC_OPT_DUPS_OBJ_REJECT:
1177                 if (cur->common.obj == node->common.obj) {
1178                         /* Reject inserting the same object */
1179                         return AO2_CONTAINER_INSERT_NODE_REJECTED;
1180                 }
1181                 next = cur;
1182                 if (options & AO2_CONTAINER_ALLOC_OPT_INSERT_BEGIN) {
1183                         /* Search to end of duplicates for the same object. */
1184                         for (;;) {
1185                                 next = rb_node_next_full(next);
1186                                 if (!next) {
1187                                         break;
1188                                 }
1189                                 if (next->common.obj == node->common.obj) {
1190                                         /* Reject inserting the same object */
1191                                         return AO2_CONTAINER_INSERT_NODE_REJECTED;
1192                                 }
1193                                 cmp = sort_fn(next->common.obj, node->common.obj, OBJ_SEARCH_OBJECT);
1194                                 if (cmp) {
1195                                         break;
1196                                 }
1197                         }
1198
1199                         /* Find first duplicate node. */
1200                         for (;;) {
1201                                 next = rb_node_prev_full(cur);
1202                                 if (!next) {
1203                                         break;
1204                                 }
1205                                 if (next->common.obj == node->common.obj) {
1206                                         /* Reject inserting the same object */
1207                                         return AO2_CONTAINER_INSERT_NODE_REJECTED;
1208                                 }
1209                                 cmp = sort_fn(next->common.obj, node->common.obj, OBJ_SEARCH_OBJECT);
1210                                 if (cmp) {
1211                                         break;
1212                                 }
1213                                 cur = next;
1214                         }
1215                         if (!cur->left) {
1216                                 /* Node becomes a left child */
1217                                 cur->left = node;
1218                         } else {
1219                                 /* Node becomes a right child */
1220                                 cur = rb_node_most_right(cur->left);
1221                                 cur->right = node;
1222                         }
1223                 } else {
1224                         /* Search to beginning of duplicates for the same object. */
1225                         for (;;) {
1226                                 next = rb_node_prev_full(next);
1227                                 if (!next) {
1228                                         break;
1229                                 }
1230                                 if (next->common.obj == node->common.obj) {
1231                                         /* Reject inserting the same object */
1232                                         return AO2_CONTAINER_INSERT_NODE_REJECTED;
1233                                 }
1234                                 cmp = sort_fn(next->common.obj, node->common.obj, OBJ_SEARCH_OBJECT);
1235                                 if (cmp) {
1236                                         break;
1237                                 }
1238                         }
1239
1240                         /* Find last duplicate node. */
1241                         for (;;) {
1242                                 next = rb_node_next_full(cur);
1243                                 if (!next) {
1244                                         break;
1245                                 }
1246                                 if (next->common.obj == node->common.obj) {
1247                                         /* Reject inserting the same object */
1248                                         return AO2_CONTAINER_INSERT_NODE_REJECTED;
1249                                 }
1250                                 cmp = sort_fn(next->common.obj, node->common.obj, OBJ_SEARCH_OBJECT);
1251                                 if (cmp) {
1252                                         break;
1253                                 }
1254                                 cur = next;
1255                         }
1256                         if (!cur->right) {
1257                                 /* Node becomes a right child */
1258                                 cur->right = node;
1259                         } else {
1260                                 /* Node becomes a left child */
1261                                 cur = rb_node_most_left(cur->right);
1262                                 cur->left = node;
1263                         }
1264                 }
1265                 break;
1266         case AO2_CONTAINER_ALLOC_OPT_DUPS_REPLACE:
1267                 SWAP(cur->common.obj, node->common.obj);
1268                 ao2_t_ref(node, -1, "Don't need the new node.");
1269                 return AO2_CONTAINER_INSERT_NODE_OBJ_REPLACED;
1270         }
1271
1272         /* Complete inserting duplicate node. */
1273         node->parent = cur;
1274         rb_insert_fixup(self, node);
1275         return AO2_CONTAINER_INSERT_NODE_INSERTED;
1276 }
1277
1278 /*!
1279  * \internal
1280  * \brief Find the next rbtree container node in a traversal.
1281  * \since 12.0.0
1282  *
1283  * \param self Container to operate upon.
1284  * \param state Traversal state to restart rbtree container traversal.
1285  * \param prev Previous node returned by the traversal search functions.
1286  *    The ref ownership is passed back to this function.
1287  *
1288  * \retval node-ptr of found node (Reffed).
1289  * \retval NULL when no node found.
1290  */
1291 static struct rbtree_node *rb_ao2_find_next(struct ao2_container_rbtree *self, struct rbtree_traversal_state *state, struct rbtree_node *prev)
1292 {
1293         struct rbtree_node *node;
1294         void *arg;
1295         enum search_flags flags;
1296         int cmp;
1297
1298         arg = state->arg;
1299         flags = state->flags;
1300
1301         node = prev;
1302         for (;;) {
1303                 /* Find next node in traversal order. */
1304                 switch (flags & OBJ_ORDER_MASK) {
1305                 default:
1306                 case OBJ_ORDER_ASCENDING:
1307                         node = rb_node_next(node);
1308                         break;
1309                 case OBJ_ORDER_DESCENDING:
1310                         node = rb_node_prev(node);
1311                         break;
1312                 case OBJ_ORDER_PRE:
1313                         node = rb_node_pre(node);
1314                         break;
1315                 case OBJ_ORDER_POST:
1316                         node = rb_node_post(node);
1317                         break;
1318                 }
1319                 if (!node) {
1320                         /* No more nodes left to traverse. */
1321                         break;
1322                 }
1323                 if (!node->common.obj) {
1324                         /* Node is empty */
1325                         continue;
1326                 }
1327
1328                 if (state->sort_fn) {
1329                         /* Filter node through the sort_fn */
1330                         cmp = state->sort_fn(node->common.obj, arg, flags & OBJ_SEARCH_MASK);
1331                         if (cmp) {
1332                                 /* No more nodes in this container are possible to match. */
1333                                 break;
1334                         }
1335                 }
1336
1337                 /* We have the next traversal node */
1338                 __ao2_ref(node, +1);
1339
1340                 /*
1341                  * Dereferencing the prev node may result in our next node
1342                  * object being removed by another thread.  This could happen if
1343                  * the container uses RW locks and the container was read
1344                  * locked.
1345                  */
1346                 __ao2_ref(prev, -1);
1347                 if (node->common.obj) {
1348                         return node;
1349                 }
1350                 prev = node;
1351         }
1352
1353         /* No more nodes in the container left to traverse. */
1354         __ao2_ref(prev, -1);
1355         return NULL;
1356 }
1357
1358 /*!
1359  * \internal
1360  * \brief Find an initial matching node.
1361  * \since 12.0.0
1362  *
1363  * \param self Container to operate upon.
1364  * \param obj_right pointer to the (user-defined part) of an object.
1365  * \param flags flags from ao2_callback()
1366  *   OBJ_SEARCH_OBJECT - if set, 'obj_right', is an object.
1367  *   OBJ_SEARCH_KEY - if set, 'obj_right', is a search key item that is not an object.
1368  *   OBJ_SEARCH_PARTIAL_KEY - if set, 'obj_right', is a partial search key item that is not an object.
1369  * \param bias How to bias search direction for duplicates
1370  *
1371  * \retval node on success.
1372  * \retval NULL if not found.
1373  */
1374 static struct rbtree_node *rb_find_initial(struct ao2_container_rbtree *self, void *obj_right, enum search_flags flags, enum equal_node_bias bias)
1375 {
1376         int cmp;
1377         enum search_flags sort_flags;
1378         struct rbtree_node *node;
1379         struct rbtree_node *next = NULL;
1380         ao2_sort_fn *sort_fn;
1381
1382         sort_flags = flags & OBJ_SEARCH_MASK;
1383         sort_fn = self->common.sort_fn;
1384
1385         /* Find node where normal search would find it. */
1386         node = self->root;
1387         if (!node) {
1388                 return NULL;
1389         }
1390         for (;;) {
1391                 if (!node->common.obj) {
1392                         /* Which direction do we go to find the node? */
1393                         if (rb_find_empty_direction(node, sort_fn, obj_right, sort_flags, bias)
1394                                 == GO_LEFT) {
1395                                 next = node->left;
1396                         } else {
1397                                 next = node->right;
1398                         }
1399                         if (!next) {
1400                                 switch (bias) {
1401                                 case BIAS_FIRST:
1402                                         /* Check successor node for match. */
1403                                         next = rb_node_next_full(node);
1404                                         break;
1405                                 case BIAS_EQUAL:
1406                                         break;
1407                                 case BIAS_LAST:
1408                                         /* Check previous node for match. */
1409                                         next = rb_node_prev_full(node);
1410                                         break;
1411                                 }
1412                                 if (next) {
1413                                         cmp = sort_fn(next->common.obj, obj_right, sort_flags);
1414                                         if (cmp == 0) {
1415                                                 /* Found the first/last matching node. */
1416                                                 return next;
1417                                         }
1418                                         next = NULL;
1419                                 }
1420
1421                                 /* No match found. */
1422                                 return next;
1423                         }
1424                 } else {
1425                         cmp = sort_fn(node->common.obj, obj_right, sort_flags);
1426                         if (cmp > 0) {
1427                                 next = node->left;
1428                         } else if (cmp < 0) {
1429                                 next = node->right;
1430                         } else {
1431                                 switch (bias) {
1432                                 case BIAS_FIRST:
1433                                         next = node->left;
1434                                         break;
1435                                 case BIAS_EQUAL:
1436                                         return node;
1437                                 case BIAS_LAST:
1438                                         next = node->right;
1439                                         break;
1440                                 }
1441                                 if (!next) {
1442                                         /* Found the first/last matching node. */
1443                                         return node;
1444                                 }
1445                         }
1446                         if (!next) {
1447                                 switch (bias) {
1448                                 case BIAS_FIRST:
1449                                         if (cmp < 0) {
1450                                                 /* Check successor node for match. */
1451                                                 next = rb_node_next_full(node);
1452                                         }
1453                                         break;
1454                                 case BIAS_EQUAL:
1455                                         break;
1456                                 case BIAS_LAST:
1457                                         if (cmp > 0) {
1458                                                 /* Check previous node for match. */
1459                                                 next = rb_node_prev_full(node);
1460                                         }
1461                                         break;
1462                                 }
1463                                 if (next) {
1464                                         cmp = sort_fn(next->common.obj, obj_right, sort_flags);
1465                                         if (cmp == 0) {
1466                                                 /* Found the first/last matching node. */
1467                                                 return next;
1468                                         }
1469                                 }
1470
1471                                 /* No match found. */
1472                                 return NULL;
1473                         }
1474                 }
1475                 node = next;
1476         }
1477 }
1478
1479 /*!
1480  * \internal
1481  * \brief Find the first rbtree container node in a traversal.
1482  * \since 12.0.0
1483  *
1484  * \param self Container to operate upon.
1485  * \param flags search_flags to control traversing the container
1486  * \param arg Comparison callback arg parameter.
1487  * \param state Traversal state to restart rbtree container traversal.
1488  *
1489  * \retval node-ptr of found node (Reffed).
1490  * \retval NULL when no node found.
1491  */
1492 static struct rbtree_node *rb_ao2_find_first(struct ao2_container_rbtree *self, enum search_flags flags, void *arg, struct rbtree_traversal_state *state)
1493 {
1494         struct rbtree_node *node;
1495         enum equal_node_bias bias;
1496
1497         if (self->common.destroying) {
1498                 /* Force traversal to be post order for tree destruction. */
1499                 flags = OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE | OBJ_ORDER_POST;
1500         }
1501
1502         memset(state, 0, sizeof(*state));
1503         state->arg = arg;
1504         state->flags = flags;
1505
1506         switch (flags & OBJ_SEARCH_MASK) {
1507         case OBJ_SEARCH_OBJECT:
1508         case OBJ_SEARCH_KEY:
1509         case OBJ_SEARCH_PARTIAL_KEY:
1510                 /* We are asked to do a directed search. */
1511                 state->sort_fn = self->common.sort_fn;
1512                 break;
1513         default:
1514                 /* Don't know, let's visit all nodes */
1515                 state->sort_fn = NULL;
1516                 break;
1517         }
1518
1519         if (!self->root) {
1520                 /* Tree is empty. */
1521                 return NULL;
1522         }
1523
1524         /* Find first traversal node. */
1525         switch (flags & OBJ_ORDER_MASK) {
1526         default:
1527         case OBJ_ORDER_ASCENDING:
1528                 if (!state->sort_fn) {
1529                         /* Find left most child. */
1530                         node = rb_node_most_left(self->root);
1531                         if (!node->common.obj) {
1532                                 node = rb_node_next_full(node);
1533                                 if (!node) {
1534                                         return NULL;
1535                                 }
1536                         }
1537                         break;
1538                 }
1539
1540                 /* Search for initial node. */
1541                 switch (self->common.options & AO2_CONTAINER_ALLOC_OPT_DUPS_MASK) {
1542                 case AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT:
1543                 case AO2_CONTAINER_ALLOC_OPT_DUPS_REPLACE:
1544                         if ((flags & OBJ_SEARCH_MASK) != OBJ_SEARCH_PARTIAL_KEY) {
1545                                 /* There are no duplicates allowed. */
1546                                 bias = BIAS_EQUAL;
1547                                 break;
1548                         }
1549                         /* Fall through */
1550                 default:
1551                 case AO2_CONTAINER_ALLOC_OPT_DUPS_ALLOW:
1552                 case AO2_CONTAINER_ALLOC_OPT_DUPS_OBJ_REJECT:
1553                         /* Find first duplicate node. */
1554                         bias = BIAS_FIRST;
1555                         break;
1556                 }
1557                 node = rb_find_initial(self, arg, flags, bias);
1558                 if (!node) {
1559                         return NULL;
1560                 }
1561                 break;
1562         case OBJ_ORDER_DESCENDING:
1563                 if (!state->sort_fn) {
1564                         /* Find right most child. */
1565                         node = rb_node_most_right(self->root);
1566                         if (!node->common.obj) {
1567                                 node = rb_node_prev_full(node);
1568                                 if (!node) {
1569                                         return NULL;
1570                                 }
1571                         }
1572                         break;
1573                 }
1574
1575                 /* Search for initial node. */
1576                 switch (self->common.options & AO2_CONTAINER_ALLOC_OPT_DUPS_MASK) {
1577                 case AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT:
1578                 case AO2_CONTAINER_ALLOC_OPT_DUPS_REPLACE:
1579                         if ((flags & OBJ_SEARCH_MASK) != OBJ_SEARCH_PARTIAL_KEY) {
1580                                 /* There are no duplicates allowed. */
1581                                 bias = BIAS_EQUAL;
1582                                 break;
1583                         }
1584                         /* Fall through */
1585                 default:
1586                 case AO2_CONTAINER_ALLOC_OPT_DUPS_ALLOW:
1587                 case AO2_CONTAINER_ALLOC_OPT_DUPS_OBJ_REJECT:
1588                         /* Find last duplicate node. */
1589                         bias = BIAS_LAST;
1590                         break;
1591                 }
1592                 node = rb_find_initial(self, arg, flags, bias);
1593                 if (!node) {
1594                         return NULL;
1595                 }
1596                 break;
1597         case OBJ_ORDER_PRE:
1598                 /* This is a tree structure traversal so we must visit all nodes. */
1599                 state->sort_fn = NULL;
1600
1601                 node = self->root;
1602
1603                 /* Find a non-empty node. */
1604                 while (!node->common.obj) {
1605                         node = rb_node_pre(node);
1606                         if (!node) {
1607                                 return NULL;
1608                         }
1609                 }
1610                 break;
1611         case OBJ_ORDER_POST:
1612                 /* This is a tree structure traversal so we must visit all nodes. */
1613                 state->sort_fn = NULL;
1614
1615                 /* Find the left most childless node. */
1616                 node = self->root;
1617                 for (;;) {
1618                         node = rb_node_most_left(node);
1619                         if (!node->right) {
1620                                 /* This node has no children. */
1621                                 break;
1622                         }
1623                         node = node->right;
1624                 }
1625
1626                 /* Find a non-empty node. */
1627                 while (!node->common.obj) {
1628                         node = rb_node_post(node);
1629                         if (!node) {
1630                                 return NULL;
1631                         }
1632                 }
1633                 break;
1634         }
1635
1636         /* We have the first traversal node */
1637         __ao2_ref(node, +1);
1638         return node;
1639 }
1640
1641 /*!
1642  * \internal
1643  * \brief Find the next non-empty iteration node in the container.
1644  * \since 12.0.0
1645  *
1646  * \param self Container to operate upon.
1647  * \param node Previous node returned by the iterator.
1648  * \param flags search_flags to control iterating the container.
1649  *   Only AO2_ITERATOR_DESCENDING is useful by the method.
1650  *
1651  * \note The container is already locked.
1652  *
1653  * \retval node on success.
1654  * \retval NULL on error or no more nodes in the container.
1655  */
1656 static struct rbtree_node *rb_ao2_iterator_next(struct ao2_container_rbtree *self, struct rbtree_node *node, enum ao2_iterator_flags flags)
1657 {
1658         if (flags & AO2_ITERATOR_DESCENDING) {
1659                 if (!node) {
1660                         /* Find right most node. */
1661                         if (!self->root) {
1662                                 return NULL;
1663                         }
1664                         node = rb_node_most_right(self->root);
1665                         if (node->common.obj) {
1666                                 /* Found a non-empty node. */
1667                                 return node;
1668                         }
1669                 }
1670                 /* Find next non-empty node. */
1671                 node = rb_node_prev_full(node);
1672         } else {
1673                 if (!node) {
1674                         /* Find left most node. */
1675                         if (!self->root) {
1676                                 return NULL;
1677                         }
1678                         node = rb_node_most_left(self->root);
1679                         if (node->common.obj) {
1680                                 /* Found a non-empty node. */
1681                                 return node;
1682                         }
1683                 }
1684                 /* Find next non-empty node. */
1685                 node = rb_node_next_full(node);
1686         }
1687
1688         return node;
1689 }
1690
1691 /*!
1692  * \internal
1693  *
1694  * \brief Destroy this container.
1695  * \since 12.0.0
1696  *
1697  * \param self Container to operate upon.
1698  *
1699  * \return Nothing
1700  */
1701 static void rb_ao2_destroy(struct ao2_container_rbtree *self)
1702 {
1703         /* Check that the container no longer has any nodes */
1704         if (self->root) {
1705                 ast_log(LOG_ERROR, "Node ref leak.  Red-Black tree container still has nodes!\n");
1706                 ast_assert(0);
1707         }
1708 }
1709
1710 #if defined(AO2_DEBUG)
1711 /*!
1712  * \internal
1713  * \brief Display contents of the specified container.
1714  * \since 12.0.0
1715  *
1716  * \param self Container to dump.
1717  * \param where User data needed by prnt to determine where to put output.
1718  * \param prnt Print output callback function to use.
1719  * \param prnt_obj Callback function to print the given object's key. (NULL if not available)
1720  *
1721  * \return Nothing
1722  */
1723 static void rb_ao2_dump(struct ao2_container_rbtree *self, void *where, ao2_prnt_fn *prnt, ao2_prnt_obj_fn *prnt_obj)
1724 {
1725 #define FORMAT  "%16s, %16s, %16s, %16s, %5s, %16s, %s\n"
1726 #define FORMAT2 "%16p, %16p, %16p, %16p, %5s, %16p, "
1727
1728         struct rbtree_node *node;
1729
1730         prnt(where, FORMAT, "Node", "Parent", "Left", "Right", "Color", "Obj", "Key");
1731         for (node = self->root; node; node = rb_node_pre(node)) {
1732                 prnt(where, FORMAT2,
1733                         node,
1734                         node->parent,
1735                         node->left,
1736                         node->right,
1737                         node->is_red ? "Red" : "Black",
1738                         node->common.obj);
1739                 if (node->common.obj && prnt_obj) {
1740                         prnt_obj(node->common.obj, where, prnt);
1741                 }
1742                 prnt(where, "\n");
1743         }
1744
1745 #undef FORMAT
1746 #undef FORMAT2
1747 }
1748 #endif  /* defined(AO2_DEBUG) */
1749
1750 #if defined(AO2_DEBUG)
1751 /*!
1752  * \internal
1753  * \brief Display statistics of the specified container.
1754  * \since 12.0.0
1755  *
1756  * \param self Container to display statistics.
1757  * \param where User data needed by prnt to determine where to put output.
1758  * \param prnt Print output callback function to use.
1759  *
1760  * \note The container is already locked for reading.
1761  *
1762  * \return Nothing
1763  */
1764 static void rb_ao2_stats(struct ao2_container_rbtree *self, void *where, ao2_prnt_fn *prnt)
1765 {
1766         int idx;
1767
1768         for (idx = 0; idx < ARRAY_LEN(self->stats.fixup_insert_left); ++idx) {
1769                 prnt(where, "Number of left insert fixups case %d: %d\n", idx + 1,
1770                         self->stats.fixup_insert_left[idx]);
1771         }
1772         for (idx = 0; idx < ARRAY_LEN(self->stats.fixup_insert_right); ++idx) {
1773                 prnt(where, "Number of right insert fixups case %d: %d\n", idx + 1,
1774                         self->stats.fixup_insert_right[idx]);
1775         }
1776
1777         for (idx = 0; idx < ARRAY_LEN(self->stats.delete_children); ++idx) {
1778                 prnt(where, "Number of nodes deleted with %d children: %d\n", idx,
1779                         self->stats.delete_children[idx]);
1780         }
1781         for (idx = 0; idx < ARRAY_LEN(self->stats.fixup_delete_left); ++idx) {
1782                 prnt(where, "Number of left delete fixups case %d: %d\n", idx + 1,
1783                         self->stats.fixup_delete_left[idx]);
1784         }
1785         for (idx = 0; idx < ARRAY_LEN(self->stats.fixup_delete_right); ++idx) {
1786                 prnt(where, "Number of right delete fixups case %d: %d\n", idx + 1,
1787                         self->stats.fixup_delete_right[idx]);
1788         }
1789 }
1790 #endif  /* defined(AO2_DEBUG) */
1791
1792 #if defined(AO2_DEBUG)
1793 /*!
1794  * \internal
1795  * \brief Check the black height of the given node.
1796  * \since 12.0.0
1797  *
1798  * \param node Node to check black height.
1799  *
1800  * \retval black-height of node on success.
1801  * \retval -1 on error.  Node black height did not balance.
1802  */
1803 static int rb_check_black_height(struct rbtree_node *node)
1804 {
1805         int height_left;
1806         int height_right;
1807
1808         if (!node) {
1809                 /* A NULL child is a black node. */
1810                 return 0;
1811         }
1812
1813         height_left = rb_check_black_height(node->left);
1814         if (height_left < 0) {
1815                 return -1;
1816         }
1817         height_right = rb_check_black_height(node->right);
1818         if (height_right < 0) {
1819                 return -1;
1820         }
1821         if (height_left != height_right) {
1822                 ast_log(LOG_ERROR,
1823                         "Tree node black height of children does not match! L:%d != R:%d\n",
1824                         height_left, height_right);
1825                 return -1;
1826         }
1827         if (!node->is_red) {
1828                 /* The node itself is black. */
1829                 ++height_left;
1830         }
1831         return height_left;
1832 }
1833
1834 #endif  /* defined(AO2_DEBUG) */
1835
1836 #if defined(AO2_DEBUG)
1837 /*!
1838  * \internal
1839  * \brief Perform an integrity check on the specified container.
1840  * \since 12.0.0
1841  *
1842  * \param self Container to check integrity.
1843  *
1844  * \note The container is already locked for reading.
1845  *
1846  * \retval 0 on success.
1847  * \retval -1 on error.
1848  */
1849 static int rb_ao2_integrity(struct ao2_container_rbtree *self)
1850 {
1851         int res;
1852         int count_node;
1853         int count_obj;
1854         void *obj_last;
1855         struct rbtree_node *node;
1856
1857         res = 0;
1858
1859         count_node = 0;
1860         count_obj = 0;
1861
1862         /*
1863          * See the properties listed at struct rbtree_node definition.
1864          *
1865          * The rbtree properties 1 and 3 are not testable.
1866          *
1867          * Property 1 is not testable because we are not rebalancing at
1868          * this time so all nodes are either red or black.
1869          *
1870          * Property 3 is not testable because it is the definition of a
1871          * NULL child.
1872          */
1873         if (self->root) {
1874                 /* Check tree links. */
1875                 if (self->root->parent) {
1876                         if (self->root->parent == self->root) {
1877                                 ast_log(LOG_ERROR, "Tree root parent pointer points to itself!\n");
1878                         } else {
1879                                 ast_log(LOG_ERROR, "Tree root is not a root node!\n");
1880                         }
1881                         return -1;
1882                 }
1883                 if (self->root->is_red) {
1884                         /* Violation rbtree property 2. */
1885                         ast_log(LOG_ERROR, "Tree root is red!\n");
1886                         res = -1;
1887                 }
1888                 node = self->root;
1889                 do {
1890                         if (node->left) {
1891                                 if (node->left == node) {
1892                                         ast_log(LOG_ERROR, "Tree node's left pointer points to itself!\n");
1893                                         return -1;
1894                                 }
1895                                 if (node->left->parent != node) {
1896                                         ast_log(LOG_ERROR, "Tree node's left child does not link back!\n");
1897                                         return -1;
1898                                 }
1899                         }
1900                         if (node->right) {
1901                                 if (node->right == node) {
1902                                         ast_log(LOG_ERROR, "Tree node's right pointer points to itself!\n");
1903                                         return -1;
1904                                 }
1905                                 if (node->right->parent != node) {
1906                                         ast_log(LOG_ERROR, "Tree node's right child does not link back!\n");
1907                                         return -1;
1908                                 }
1909                         }
1910
1911                         /* Check red/black node flags. */
1912                         if (node->is_red) {
1913                                 /* A red node must have two black children or no children. */
1914                                 if (node->left && node->right) {
1915                                         /* Node has two children. */
1916                                         if (node->left->is_red) {
1917                                                 /* Violation rbtree property 4. */
1918                                                 ast_log(LOG_ERROR, "Tree node is red and its left child is red!\n");
1919                                                 res = -1;
1920                                         }
1921                                         if (node->right->is_red) {
1922                                                 /* Violation rbtree property 4. */
1923                                                 ast_log(LOG_ERROR, "Tree node is red and its right child is red!\n");
1924                                                 res = -1;
1925                                         }
1926                                 } else if (node->left || node->right) {
1927                                         /*
1928                                          * Violation rbtree property 4 if the child is red.
1929                                          * Violation rbtree property 5 if the child is black.
1930                                          */
1931                                         ast_log(LOG_ERROR, "Tree node is red and it only has one child!\n");
1932                                         res = -1;
1933                                 }
1934                         } else {
1935                                 /*
1936                                  * A black node must have two children, or one red child, or no
1937                                  * children.  If the black node has two children and only one of
1938                                  * them is red, that red child must have two children.
1939                                  */
1940                                 if (node->left && node->right) {
1941                                         /* Node has two children. */
1942                                         if (node->left->is_red != node->right->is_red) {
1943                                                 /* The children are not the same color. */
1944                                                 struct rbtree_node *red;
1945
1946                                                 if (node->left->is_red) {
1947                                                         red = node->left;
1948                                                 } else {
1949                                                         red = node->right;
1950                                                 }
1951                                                 if (!red->left || !red->right) {
1952                                                         /* Violation rbtree property 5. */
1953                                                         ast_log(LOG_ERROR,
1954                                                                 "Tree node is black and the red child does not have two children!\n");
1955                                                         res = -1;
1956                                                 }
1957                                         }
1958                                 } else if ((node->left && !node->left->is_red)
1959                                         || (node->right && !node->right->is_red)) {
1960                                         /* Violation rbtree property 5. */
1961                                         ast_log(LOG_ERROR, "Tree node is black and its only child is black!\n");
1962                                         res = -1;
1963                                 }
1964                         }
1965
1966                         /* Count nodes and objects. */
1967                         ++count_node;
1968                         if (node->common.obj) {
1969                                 ++count_obj;
1970                         }
1971
1972                         node = rb_node_pre(node);
1973                 } while (node);
1974
1975                 /* Check node key sort order. */
1976                 obj_last = NULL;
1977                 for (node = rb_node_most_left(self->root); node; node = rb_node_next(node)) {
1978                         if (!node->common.obj) {
1979                                 /* Node is empty. */
1980                                 continue;
1981                         }
1982
1983                         if (obj_last) {
1984                                 if (self->common.sort_fn(obj_last, node->common.obj, OBJ_SEARCH_OBJECT) > 0) {
1985                                         ast_log(LOG_ERROR, "Tree nodes are out of sorted order!\n");
1986                                         return -1;
1987                                 }
1988                         }
1989                         obj_last = node->common.obj;
1990                 }
1991
1992                 /* Completely check property 5 */
1993                 if (!res && rb_check_black_height(self->root) < 0) {
1994                         /* Violation rbtree property 5. */
1995                         res = -1;
1996                 }
1997         }
1998
1999         /* Check total obj count. */
2000         if (count_obj != ao2_container_count(&self->common)) {
2001                 ast_log(LOG_ERROR, "Total object count does not match ao2_container_count()!\n");
2002                 return -1;
2003         }
2004
2005         /* Check total node count. */
2006         if (count_node != self->common.nodes) {
2007                 ast_log(LOG_ERROR, "Total node count of %d does not match stat of %d!\n",
2008                         count_node, self->common.nodes);
2009                 return -1;
2010         }
2011
2012         return res;
2013 }
2014 #endif  /* defined(AO2_DEBUG) */
2015
2016 /*! rbtree container virtual method table. */
2017 static const struct ao2_container_methods v_table_rbtree = {
2018         .alloc_empty_clone = (ao2_container_alloc_empty_clone_fn) rb_ao2_alloc_empty_clone,
2019         .alloc_empty_clone_debug =
2020                 (ao2_container_alloc_empty_clone_debug_fn) rb_ao2_alloc_empty_clone_debug,
2021         .new_node = (ao2_container_new_node_fn) rb_ao2_new_node,
2022         .insert = (ao2_container_insert_fn) rb_ao2_insert_node,
2023         .traverse_first = (ao2_container_find_first_fn) rb_ao2_find_first,
2024         .traverse_next = (ao2_container_find_next_fn) rb_ao2_find_next,
2025         .iterator_next = (ao2_iterator_next_fn) rb_ao2_iterator_next,
2026         .destroy = (ao2_container_destroy_fn) rb_ao2_destroy,
2027 #if defined(AO2_DEBUG)
2028         .dump = (ao2_container_display) rb_ao2_dump,
2029         .stats = (ao2_container_statistics) rb_ao2_stats,
2030         .integrity = (ao2_container_integrity) rb_ao2_integrity,
2031 #endif  /* defined(AO2_DEBUG) */
2032 };
2033
2034 /*!
2035  * \brief Initialize a rbtree container.
2036  *
2037  * \param self Container to initialize.
2038  * \param options Container behaviour options (See enum ao2_container_opts)
2039  * \param sort_fn Pointer to a sort function.
2040  * \param cmp_fn Pointer to a compare function used by ao2_find.
2041  *
2042  * \return A pointer to a struct container.
2043  */
2044 static struct ao2_container *rb_ao2_container_init(struct ao2_container_rbtree *self,
2045         unsigned int options, ao2_sort_fn *sort_fn, ao2_callback_fn *cmp_fn)
2046 {
2047         if (!self) {
2048                 return NULL;
2049         }
2050
2051         self->common.v_table = &v_table_rbtree;
2052         self->common.sort_fn = sort_fn;
2053         self->common.cmp_fn = cmp_fn;
2054         self->common.options = options;
2055
2056 #ifdef AO2_DEBUG
2057         ast_atomic_fetchadd_int(&ao2.total_containers, 1);
2058 #endif  /* defined(AO2_DEBUG) */
2059
2060         return (struct ao2_container *) self;
2061 }
2062
2063 struct ao2_container *__ao2_container_alloc_rbtree(unsigned int ao2_options, unsigned int container_options,
2064         ao2_sort_fn *sort_fn, ao2_callback_fn *cmp_fn)
2065 {
2066         struct ao2_container_rbtree *self;
2067
2068         if (!sort_fn) {
2069                 /* Sanity checks. */
2070                 ast_log(LOG_ERROR, "Missing sort_fn()!\n");
2071                 return NULL;
2072         }
2073
2074         self = ao2_t_alloc_options(sizeof(*self), container_destruct, ao2_options,
2075                 "New rbtree container");
2076         return rb_ao2_container_init(self, container_options, sort_fn, cmp_fn);
2077 }
2078
2079 struct ao2_container *__ao2_container_alloc_rbtree_debug(unsigned int ao2_options, unsigned int container_options,
2080         ao2_sort_fn *sort_fn, ao2_callback_fn *cmp_fn,
2081         const char *tag, const char *file, int line, const char *func, int ref_debug)
2082 {
2083         struct ao2_container_rbtree *self;
2084
2085         if (!sort_fn) {
2086                 /* Sanity checks. */
2087                 ast_log(__LOG_ERROR, file, line, func, "Missing sort_fn()!\n");
2088                 return NULL;
2089         }
2090
2091         self = __ao2_alloc_debug(sizeof(*self),
2092                 ref_debug ? container_destruct_debug : container_destruct, ao2_options,
2093                 tag, file, line, func, ref_debug);
2094         return rb_ao2_container_init(self, container_options, sort_fn, cmp_fn);
2095 }
2096