astobj2: Add backtrace to log_bad_ao2.
[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_REGISTER_FILE()
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. (Debug version)
549  * \since 14.0.0
550  *
551  * \param self Container to operate upon.
552  * \param tag used for debugging.
553  * \param file Debug file name invoked from
554  * \param line Debug line invoked from
555  * \param func Debug function name invoked from
556  *
557  * \retval empty-clone-container on success.
558  * \retval NULL on error.
559  */
560 static struct ao2_container *rb_ao2_alloc_empty_clone(struct ao2_container_rbtree *self,
561         const char *tag, const char *file, int line, const char *func)
562 {
563         if (!__is_ao2_object(self, file, line, func)) {
564                 return NULL;
565         }
566
567         return __ao2_container_alloc_rbtree(ao2_options_get(self), self->common.options,
568                 self->common.sort_fn, self->common.cmp_fn, tag, file, line, func);
569 }
570
571 /*!
572  * \internal
573  * \brief Fixup the rbtree after deleting a node.
574  * \since 12.0.0
575  *
576  * \param self Container to operate upon.
577  * \param child Child of the node just deleted from the container.
578  *
579  * \note The child must be a dummy black node if there really
580  * was no child of the deleted node.  Otherwise, the caller must
581  * pass in the parent node and which child was deleted.  In
582  * addition, the fixup routine would be more complicated.
583  *
584  * \return Nothing
585  */
586 static void rb_delete_fixup(struct ao2_container_rbtree *self, struct rbtree_node *child)
587 {
588         struct rbtree_node *sibling;
589
590         while (self->root != child && !child->is_red) {
591                 if (child->parent->left == child) {
592                         /* Child is a left child. */
593                         sibling = child->parent->right;
594                         ast_assert(sibling != NULL);
595                         if (sibling->is_red) {
596                                 /* Case 1: The child's sibling is red. */
597                                 AO2_DEVMODE_STAT(++self->stats.fixup_delete_left[0]);
598                                 sibling->is_red = 0;
599                                 child->parent->is_red = 1;
600                                 rb_rotate_left(self, child->parent);
601                                 sibling = child->parent->right;
602                                 ast_assert(sibling != NULL);
603                         }
604                         /*
605                          * The sibling is black.  A black node must have two children,
606                          * or one red child, or no children.
607                          */
608                         if ((!sibling->left || !sibling->left->is_red)
609                                 && (!sibling->right || !sibling->right->is_red)) {
610                                 /*
611                                  * Case 2: The sibling is black and both of its children are black.
612                                  *
613                                  * This case handles the two black children or no children
614                                  * possibilities of a black node.
615                                  */
616                                 AO2_DEVMODE_STAT(++self->stats.fixup_delete_left[1]);
617                                 sibling->is_red = 1;
618                                 child = child->parent;
619                         } else {
620                                 /* At this point the sibling has at least one red child. */
621                                 if (!sibling->right || !sibling->right->is_red) {
622                                         /*
623                                          * Case 3: The sibling is black, its left child is red, and its
624                                          * right child is black.
625                                          */
626                                         AO2_DEVMODE_STAT(++self->stats.fixup_delete_left[2]);
627                                         ast_assert(sibling->left != NULL);
628                                         ast_assert(sibling->left->is_red);
629                                         sibling->left->is_red = 0;
630                                         sibling->is_red = 1;
631                                         rb_rotate_right(self, sibling);
632                                         sibling = child->parent->right;
633                                         ast_assert(sibling != NULL);
634                                 }
635                                 /* Case 4: The sibling is black and its right child is red. */
636                                 AO2_DEVMODE_STAT(++self->stats.fixup_delete_left[3]);
637                                 sibling->is_red = child->parent->is_red;
638                                 child->parent->is_red = 0;
639                                 if (sibling->right) {
640                                         sibling->right->is_red = 0;
641                                 }
642                                 rb_rotate_left(self, child->parent);
643                                 child = self->root;
644                         }
645                 } else {
646                         /* Child is a right child. */
647                         sibling = child->parent->left;
648                         ast_assert(sibling != NULL);
649                         if (sibling->is_red) {
650                                 /* Case 1: The child's sibling is red. */
651                                 AO2_DEVMODE_STAT(++self->stats.fixup_delete_right[0]);
652                                 sibling->is_red = 0;
653                                 child->parent->is_red = 1;
654                                 rb_rotate_right(self, child->parent);
655                                 sibling = child->parent->left;
656                                 ast_assert(sibling != NULL);
657                         }
658                         /*
659                          * The sibling is black.  A black node must have two children,
660                          * or one red child, or no children.
661                          */
662                         if ((!sibling->right || !sibling->right->is_red)
663                                 && (!sibling->left || !sibling->left->is_red)) {
664                                 /*
665                                  * Case 2: The sibling is black and both of its children are black.
666                                  *
667                                  * This case handles the two black children or no children
668                                  * possibilities of a black node.
669                                  */
670                                 AO2_DEVMODE_STAT(++self->stats.fixup_delete_right[1]);
671                                 sibling->is_red = 1;
672                                 child = child->parent;
673                         } else {
674                                 /* At this point the sibling has at least one red child. */
675                                 if (!sibling->left || !sibling->left->is_red) {
676                                         /*
677                                          * Case 3: The sibling is black, its right child is red, and its
678                                          * left child is black.
679                                          */
680                                         AO2_DEVMODE_STAT(++self->stats.fixup_delete_right[2]);
681                                         ast_assert(sibling->right != NULL);
682                                         ast_assert(sibling->right->is_red);
683                                         sibling->right->is_red = 0;
684                                         sibling->is_red = 1;
685                                         rb_rotate_left(self, sibling);
686                                         sibling = child->parent->left;
687                                         ast_assert(sibling != NULL);
688                                 }
689                                 /* Case 4: The sibling is black and its left child is red. */
690                                 AO2_DEVMODE_STAT(++self->stats.fixup_delete_right[3]);
691                                 sibling->is_red = child->parent->is_red;
692                                 child->parent->is_red = 0;
693                                 if (sibling->left) {
694                                         sibling->left->is_red = 0;
695                                 }
696                                 rb_rotate_right(self, child->parent);
697                                 child = self->root;
698                         }
699                 }
700         }
701
702         /*
703          * Case 2 could leave the child node red and it needs to leave
704          * with it black.
705          *
706          * Case 4 sets the child node to the root which of course must
707          * be black.
708          */
709         child->is_red = 0;
710 }
711
712 /*!
713  * \internal
714  * \brief Delete the doomed node from this container.
715  * \since 12.0.0
716  *
717  * \param self Container to operate upon.
718  * \param doomed Container node to delete from the container.
719  *
720  * \return Nothing
721  */
722 static void rb_delete_node(struct ao2_container_rbtree *self, struct rbtree_node *doomed)
723 {
724         struct rbtree_node *child;
725         int need_fixup;
726
727         if (doomed->left && doomed->right) {
728                 struct rbtree_node *next;
729                 int is_red;
730
731                 /*
732                  * The doomed node has two children.
733                  *
734                  * Find the next child node and swap it with the doomed node in
735                  * the tree.
736                  */
737                 AO2_DEVMODE_STAT(++self->stats.delete_children[2]);
738                 next = rb_node_most_left(doomed->right);
739                 SWAP(doomed->parent, next->parent);
740                 SWAP(doomed->left, next->left);
741                 SWAP(doomed->right, next->right);
742                 is_red = doomed->is_red;
743                 doomed->is_red = next->is_red;
744                 next->is_red = is_red;
745
746                 /* Link back in the next node. */
747                 if (!next->parent) {
748                         /* Doomed was the root so we get a new root node. */
749                         self->root = next;
750                 } else if (next->parent->left == doomed) {
751                         /* Doomed was the left child. */
752                         next->parent->left = next;
753                 } else {
754                         /* Doomed was the right child. */
755                         next->parent->right = next;
756                 }
757                 next->left->parent = next;
758                 if (next->right == next) {
759                         /* The next node was the right child of doomed. */
760                         next->right = doomed;
761                         doomed->parent = next;
762                 } else {
763                         next->right->parent = next;
764                         doomed->parent->left = doomed;
765                 }
766
767                 /* The doomed node has no left child now. */
768                 ast_assert(doomed->left == NULL);
769
770                 /*
771                  * We don't have to link the right child back in with doomed
772                  * since we are going to link it with doomed's parent anyway.
773                  */
774                 child = doomed->right;
775         } else {
776                 /* Doomed has at most one child. */
777                 child = doomed->left;
778                 if (!child) {
779                         child = doomed->right;
780                 }
781         }
782         if (child) {
783                 AO2_DEVMODE_STAT(++self->stats.delete_children[1]);
784         } else {
785                 AO2_DEVMODE_STAT(++self->stats.delete_children[0]);
786         }
787
788         need_fixup = (!doomed->is_red && !self->common.destroying);
789         if (need_fixup && !child) {
790                 /*
791                  * Use the doomed node as a place holder node for the
792                  * nonexistent child so we also don't have to pass to the fixup
793                  * routine the parent and which child the deleted node came
794                  * from.
795                  */
796                 rb_delete_fixup(self, doomed);
797                 ast_assert(doomed->left == NULL);
798                 ast_assert(doomed->right == NULL);
799                 ast_assert(!doomed->is_red);
800         }
801
802         /* Link the child in place of doomed. */
803         if (!doomed->parent) {
804                 /* Doomed was the root so we get a new root node. */
805                 self->root = child;
806         } else if (doomed->parent->left == doomed) {
807                 /* Doomed was the left child. */
808                 doomed->parent->left = child;
809         } else {
810                 /* Doomed was the right child. */
811                 doomed->parent->right = child;
812         }
813         if (child) {
814                 child->parent = doomed->parent;
815                 if (need_fixup) {
816                         rb_delete_fixup(self, child);
817                 }
818         }
819
820         AO2_DEVMODE_STAT(--self->common.nodes);
821 }
822
823 /*!
824  * \internal
825  * \brief Destroy a rbtree container node.
826  * \since 12.0.0
827  *
828  * \param v_doomed Container node to destroy.
829  *
830  * \details
831  * The container node unlinks itself from the container as part
832  * of its destruction.  The node must be destroyed while the
833  * container is already locked.
834  *
835  * \note The container must be locked when the node is
836  * unreferenced.
837  *
838  * \return Nothing
839  */
840 static void rb_ao2_node_destructor(void *v_doomed)
841 {
842         struct rbtree_node *doomed = v_doomed;
843
844         if (doomed->common.is_linked) {
845                 struct ao2_container_rbtree *my_container;
846
847                 /*
848                  * Promote to write lock if not already there.  Since
849                  * adjust_lock() can potentially release and block waiting for a
850                  * write lock, care must be taken to ensure that node references
851                  * are released before releasing the container references.
852                  *
853                  * Node references held by an iterator can only be held while
854                  * the iterator also holds a reference to the container.  These
855                  * node references must be unreferenced before the container can
856                  * be unreferenced to ensure that the node will not get a
857                  * negative reference and the destructor called twice for the
858                  * same node.
859                  */
860                 my_container = (struct ao2_container_rbtree *) doomed->common.my_container;
861 #ifdef AST_DEVMODE
862                 is_ao2_object(my_container);
863 #endif
864
865                 __adjust_lock(my_container, AO2_LOCK_REQ_WRLOCK, 1);
866
867 #if defined(AO2_DEBUG)
868                 if (!my_container->common.destroying
869                         && ao2_container_check(doomed->common.my_container, OBJ_NOLOCK)) {
870                         ast_log(LOG_ERROR, "Container integrity failed before node deletion.\n");
871                 }
872 #endif  /* defined(AO2_DEBUG) */
873                 rb_delete_node(my_container, doomed);
874 #if defined(AO2_DEBUG)
875                 if (!my_container->common.destroying
876                         && ao2_container_check(doomed->common.my_container, OBJ_NOLOCK)) {
877                         ast_log(LOG_ERROR, "Container integrity failed after node deletion.\n");
878                 }
879 #endif  /* defined(AO2_DEBUG) */
880         }
881
882         /*
883          * We could have an object in the node if the container is being
884          * destroyed or the node had not been linked in yet.
885          */
886         if (doomed->common.obj) {
887                 __container_unlink_node(&doomed->common, AO2_UNLINK_NODE_UNLINK_OBJECT);
888         }
889 }
890
891 /*!
892  * \internal
893  * \brief Create a new container node.
894  * \since 12.0.0
895  *
896  * \param self Container to operate upon.
897  * \param obj_new Object to put into the node.
898  * \param tag used for debugging.
899  * \param file Debug file name invoked from
900  * \param line Debug line invoked from
901  * \param func Debug function name invoked from
902  *
903  * \retval initialized-node on success.
904  * \retval NULL on error.
905  */
906 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)
907 {
908         struct rbtree_node *node;
909
910         node = ao2_t_alloc_options(sizeof(*node), rb_ao2_node_destructor, AO2_ALLOC_OPT_LOCK_NOLOCK, NULL);
911         if (!node) {
912                 return NULL;
913         }
914
915         __ao2_ref(obj_new, +1, tag ?: "Container node creation", file, line, func);
916         node->common.obj = obj_new;
917         node->common.my_container = (struct ao2_container *) self;
918
919         return node;
920 }
921
922 /*!
923  * \internal
924  * \brief Fixup the rbtree after inserting a node.
925  * \since 12.0.0
926  *
927  * \param self Container to operate upon.
928  * \param node Container node just inserted into the container.
929  *
930  * \note The just inserted node is red.
931  *
932  * \return Nothing
933  */
934 static void rb_insert_fixup(struct ao2_container_rbtree *self, struct rbtree_node *node)
935 {
936         struct rbtree_node *g_parent;   /* Grand parent node. */
937
938         while (node->parent && node->parent->is_red) {
939                 g_parent = node->parent->parent;
940
941                 /* The grand parent must exist if the parent is red. */
942                 ast_assert(g_parent != NULL);
943
944                 if (node->parent == g_parent->left) {
945                         /* The parent is a left child. */
946                         if (g_parent->right && g_parent->right->is_red) {
947                                 /* Case 1: Push the black down from the grand parent node. */
948                                 AO2_DEVMODE_STAT(++self->stats.fixup_insert_left[0]);
949                                 g_parent->right->is_red = 0;
950                                 g_parent->left->is_red = 0;
951                                 g_parent->is_red = 1;
952
953                                 node = g_parent;
954                         } else {
955                                 /* The uncle node is black. */
956                                 if (node->parent->right == node) {
957                                         /*
958                                          * Case 2: The node is a right child.
959                                          *
960                                          * Which node is the grand parent does not change.
961                                          */
962                                         AO2_DEVMODE_STAT(++self->stats.fixup_insert_left[1]);
963                                         node = node->parent;
964                                         rb_rotate_left(self, node);
965                                 }
966                                 /* Case 3: The node is a left child. */
967                                 AO2_DEVMODE_STAT(++self->stats.fixup_insert_left[2]);
968                                 node->parent->is_red = 0;
969                                 g_parent->is_red = 1;
970                                 rb_rotate_right(self, g_parent);
971                         }
972                 } else {
973                         /* The parent is a right child. */
974                         if (g_parent->left && g_parent->left->is_red) {
975                                 /* Case 1: Push the black down from the grand parent node. */
976                                 AO2_DEVMODE_STAT(++self->stats.fixup_insert_right[0]);
977                                 g_parent->left->is_red = 0;
978                                 g_parent->right->is_red = 0;
979                                 g_parent->is_red = 1;
980
981                                 node = g_parent;
982                         } else {
983                                 /* The uncle node is black. */
984                                 if (node->parent->left == node) {
985                                         /*
986                                          * Case 2: The node is a left child.
987                                          *
988                                          * Which node is the grand parent does not change.
989                                          */
990                                         AO2_DEVMODE_STAT(++self->stats.fixup_insert_right[1]);
991                                         node = node->parent;
992                                         rb_rotate_right(self, node);
993                                 }
994                                 /* Case 3: The node is a right child. */
995                                 AO2_DEVMODE_STAT(++self->stats.fixup_insert_right[2]);
996                                 node->parent->is_red = 0;
997                                 g_parent->is_red = 1;
998                                 rb_rotate_left(self, g_parent);
999                         }
1000                 }
1001         }
1002
1003         /*
1004          * The root could be red here because:
1005          * 1) We just inserted the root node in an empty tree.
1006          *
1007          * 2) Case 1 could leave the root red if the grand parent were
1008          * the root.
1009          */
1010         self->root->is_red = 0;
1011 }
1012
1013 /*!
1014  * \internal
1015  * \brief Insert a node into this container.
1016  * \since 12.0.0
1017  *
1018  * \param self Container to operate upon.
1019  * \param node Container node to insert into the container.
1020  *
1021  * \return enum ao2_container_insert value.
1022  */
1023 static enum ao2_container_insert rb_ao2_insert_node(struct ao2_container_rbtree *self, struct rbtree_node *node)
1024 {
1025         int cmp;
1026         struct rbtree_node *cur;
1027         struct rbtree_node *next;
1028         ao2_sort_fn *sort_fn;
1029         uint32_t options;
1030         enum equal_node_bias bias;
1031
1032         if (!self->root) {
1033                 /* The tree is empty. */
1034                 self->root = node;
1035                 return AO2_CONTAINER_INSERT_NODE_INSERTED;
1036         }
1037
1038         sort_fn = self->common.sort_fn;
1039         options = self->common.options;
1040         switch (options & AO2_CONTAINER_ALLOC_OPT_DUPS_MASK) {
1041         default:
1042         case AO2_CONTAINER_ALLOC_OPT_DUPS_ALLOW:
1043                 if (options & AO2_CONTAINER_ALLOC_OPT_INSERT_BEGIN) {
1044                         bias = BIAS_FIRST;
1045                 } else {
1046                         bias = BIAS_LAST;
1047                 }
1048                 break;
1049         case AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT:
1050         case AO2_CONTAINER_ALLOC_OPT_DUPS_OBJ_REJECT:
1051         case AO2_CONTAINER_ALLOC_OPT_DUPS_REPLACE:
1052                 bias = BIAS_EQUAL;
1053                 break;
1054         }
1055
1056         /*
1057          * New nodes are always colored red when initially inserted into
1058          * the tree.  (Except for the root which is always black.)
1059          */
1060         node->is_red = 1;
1061
1062         /* Find node where normal insert would put a new node. */
1063         cur = self->root;
1064         for (;;) {
1065                 if (!cur->common.obj) {
1066                         /* Which direction do we go to insert this node? */
1067                         if (rb_find_empty_direction(cur, sort_fn, node->common.obj, OBJ_SEARCH_OBJECT, bias)
1068                                 == GO_LEFT) {
1069                                 if (cur->left) {
1070                                         cur = cur->left;
1071                                         continue;
1072                                 }
1073
1074                                 /* Node becomes a left child */
1075                                 cur->left = node;
1076                                 node->parent = cur;
1077                                 rb_insert_fixup(self, node);
1078                                 return AO2_CONTAINER_INSERT_NODE_INSERTED;
1079                         }
1080                         if (cur->right) {
1081                                 cur = cur->right;
1082                                 continue;
1083                         }
1084
1085                         /* Node becomes a right child */
1086                         cur->right = node;
1087                         node->parent = cur;
1088                         rb_insert_fixup(self, node);
1089                         return AO2_CONTAINER_INSERT_NODE_INSERTED;
1090                 }
1091                 cmp = sort_fn(cur->common.obj, node->common.obj, OBJ_SEARCH_OBJECT);
1092                 if (cmp > 0) {
1093                         if (cur->left) {
1094                                 cur = cur->left;
1095                                 continue;
1096                         }
1097
1098                         /* Node becomes a left child */
1099                         cur->left = node;
1100                         node->parent = cur;
1101                         rb_insert_fixup(self, node);
1102                         return AO2_CONTAINER_INSERT_NODE_INSERTED;
1103                 } else if (cmp < 0) {
1104                         if (cur->right) {
1105                                 cur = cur->right;
1106                                 continue;
1107                         }
1108
1109                         /* Node becomes a right child */
1110                         cur->right = node;
1111                         node->parent = cur;
1112                         rb_insert_fixup(self, node);
1113                         return AO2_CONTAINER_INSERT_NODE_INSERTED;
1114                 }
1115                 switch (bias) {
1116                 case BIAS_FIRST:
1117                         /* Duplicate nodes unconditionally accepted. */
1118                         if (cur->left) {
1119                                 cur = cur->left;
1120                                 continue;
1121                         }
1122
1123                         /* Node becomes a left child */
1124                         cur->left = node;
1125                         node->parent = cur;
1126                         rb_insert_fixup(self, node);
1127                         return AO2_CONTAINER_INSERT_NODE_INSERTED;
1128                 case BIAS_EQUAL:
1129                         break;
1130                 case BIAS_LAST:
1131                         /* Duplicate nodes unconditionally accepted. */
1132                         if (cur->right) {
1133                                 cur = cur->right;
1134                                 continue;
1135                         }
1136
1137                         /* Node becomes a right child */
1138                         cur->right = node;
1139                         node->parent = cur;
1140                         rb_insert_fixup(self, node);
1141                         return AO2_CONTAINER_INSERT_NODE_INSERTED;
1142                 }
1143
1144                 break;
1145         }
1146
1147         /* Node is a dupliate */
1148         switch (options & AO2_CONTAINER_ALLOC_OPT_DUPS_MASK) {
1149         default:
1150         case AO2_CONTAINER_ALLOC_OPT_DUPS_ALLOW:
1151                 ast_assert(0);/* Case already handled by BIAS_FIRST/BIAS_LAST. */
1152                 return AO2_CONTAINER_INSERT_NODE_REJECTED;
1153         case AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT:
1154                 /* Reject all objects with the same key. */
1155                 return AO2_CONTAINER_INSERT_NODE_REJECTED;
1156         case AO2_CONTAINER_ALLOC_OPT_DUPS_OBJ_REJECT:
1157                 if (cur->common.obj == node->common.obj) {
1158                         /* Reject inserting the same object */
1159                         return AO2_CONTAINER_INSERT_NODE_REJECTED;
1160                 }
1161                 next = cur;
1162                 if (options & AO2_CONTAINER_ALLOC_OPT_INSERT_BEGIN) {
1163                         /* Search to end of duplicates for the same object. */
1164                         for (;;) {
1165                                 next = rb_node_next_full(next);
1166                                 if (!next) {
1167                                         break;
1168                                 }
1169                                 if (next->common.obj == node->common.obj) {
1170                                         /* Reject inserting the same object */
1171                                         return AO2_CONTAINER_INSERT_NODE_REJECTED;
1172                                 }
1173                                 cmp = sort_fn(next->common.obj, node->common.obj, OBJ_SEARCH_OBJECT);
1174                                 if (cmp) {
1175                                         break;
1176                                 }
1177                         }
1178
1179                         /* Find first duplicate node. */
1180                         for (;;) {
1181                                 next = rb_node_prev_full(cur);
1182                                 if (!next) {
1183                                         break;
1184                                 }
1185                                 if (next->common.obj == node->common.obj) {
1186                                         /* Reject inserting the same object */
1187                                         return AO2_CONTAINER_INSERT_NODE_REJECTED;
1188                                 }
1189                                 cmp = sort_fn(next->common.obj, node->common.obj, OBJ_SEARCH_OBJECT);
1190                                 if (cmp) {
1191                                         break;
1192                                 }
1193                                 cur = next;
1194                         }
1195                         if (!cur->left) {
1196                                 /* Node becomes a left child */
1197                                 cur->left = node;
1198                         } else {
1199                                 /* Node becomes a right child */
1200                                 cur = rb_node_most_right(cur->left);
1201                                 cur->right = node;
1202                         }
1203                 } else {
1204                         /* Search to beginning of duplicates for the same object. */
1205                         for (;;) {
1206                                 next = rb_node_prev_full(next);
1207                                 if (!next) {
1208                                         break;
1209                                 }
1210                                 if (next->common.obj == node->common.obj) {
1211                                         /* Reject inserting the same object */
1212                                         return AO2_CONTAINER_INSERT_NODE_REJECTED;
1213                                 }
1214                                 cmp = sort_fn(next->common.obj, node->common.obj, OBJ_SEARCH_OBJECT);
1215                                 if (cmp) {
1216                                         break;
1217                                 }
1218                         }
1219
1220                         /* Find last duplicate node. */
1221                         for (;;) {
1222                                 next = rb_node_next_full(cur);
1223                                 if (!next) {
1224                                         break;
1225                                 }
1226                                 if (next->common.obj == node->common.obj) {
1227                                         /* Reject inserting the same object */
1228                                         return AO2_CONTAINER_INSERT_NODE_REJECTED;
1229                                 }
1230                                 cmp = sort_fn(next->common.obj, node->common.obj, OBJ_SEARCH_OBJECT);
1231                                 if (cmp) {
1232                                         break;
1233                                 }
1234                                 cur = next;
1235                         }
1236                         if (!cur->right) {
1237                                 /* Node becomes a right child */
1238                                 cur->right = node;
1239                         } else {
1240                                 /* Node becomes a left child */
1241                                 cur = rb_node_most_left(cur->right);
1242                                 cur->left = node;
1243                         }
1244                 }
1245                 break;
1246         case AO2_CONTAINER_ALLOC_OPT_DUPS_REPLACE:
1247                 SWAP(cur->common.obj, node->common.obj);
1248                 ao2_t_ref(node, -1, NULL);
1249                 return AO2_CONTAINER_INSERT_NODE_OBJ_REPLACED;
1250         }
1251
1252         /* Complete inserting duplicate node. */
1253         node->parent = cur;
1254         rb_insert_fixup(self, node);
1255         return AO2_CONTAINER_INSERT_NODE_INSERTED;
1256 }
1257
1258 /*!
1259  * \internal
1260  * \brief Find the next rbtree container node in a traversal.
1261  * \since 12.0.0
1262  *
1263  * \param self Container to operate upon.
1264  * \param state Traversal state to restart rbtree container traversal.
1265  * \param prev Previous node returned by the traversal search functions.
1266  *    The ref ownership is passed back to this function.
1267  *
1268  * \retval node-ptr of found node (Reffed).
1269  * \retval NULL when no node found.
1270  */
1271 static struct rbtree_node *rb_ao2_find_next(struct ao2_container_rbtree *self, struct rbtree_traversal_state *state, struct rbtree_node *prev)
1272 {
1273         struct rbtree_node *node;
1274         void *arg;
1275         enum search_flags flags;
1276         int cmp;
1277
1278         arg = state->arg;
1279         flags = state->flags;
1280
1281         node = prev;
1282         for (;;) {
1283                 /* Find next node in traversal order. */
1284                 switch (flags & OBJ_ORDER_MASK) {
1285                 default:
1286                 case OBJ_ORDER_ASCENDING:
1287                         node = rb_node_next(node);
1288                         break;
1289                 case OBJ_ORDER_DESCENDING:
1290                         node = rb_node_prev(node);
1291                         break;
1292                 case OBJ_ORDER_PRE:
1293                         node = rb_node_pre(node);
1294                         break;
1295                 case OBJ_ORDER_POST:
1296                         node = rb_node_post(node);
1297                         break;
1298                 }
1299                 if (!node) {
1300                         /* No more nodes left to traverse. */
1301                         break;
1302                 }
1303                 if (!node->common.obj) {
1304                         /* Node is empty */
1305                         continue;
1306                 }
1307
1308                 if (state->sort_fn) {
1309                         /* Filter node through the sort_fn */
1310                         cmp = state->sort_fn(node->common.obj, arg, flags & OBJ_SEARCH_MASK);
1311                         if (cmp) {
1312                                 /* No more nodes in this container are possible to match. */
1313                                 break;
1314                         }
1315                 }
1316
1317                 /* We have the next traversal node */
1318                 ao2_t_ref(node, +1, NULL);
1319
1320                 /*
1321                  * Dereferencing the prev node may result in our next node
1322                  * object being removed by another thread.  This could happen if
1323                  * the container uses RW locks and the container was read
1324                  * locked.
1325                  */
1326                 ao2_t_ref(prev, -1, NULL);
1327                 if (node->common.obj) {
1328                         return node;
1329                 }
1330                 prev = node;
1331         }
1332
1333         /* No more nodes in the container left to traverse. */
1334         ao2_t_ref(prev, -1, NULL);
1335         return NULL;
1336 }
1337
1338 /*!
1339  * \internal
1340  * \brief Find an initial matching node.
1341  * \since 12.0.0
1342  *
1343  * \param self Container to operate upon.
1344  * \param obj_right pointer to the (user-defined part) of an object.
1345  * \param flags flags from ao2_callback()
1346  *   OBJ_SEARCH_OBJECT - if set, 'obj_right', is an object.
1347  *   OBJ_SEARCH_KEY - if set, 'obj_right', is a search key item that is not an object.
1348  *   OBJ_SEARCH_PARTIAL_KEY - if set, 'obj_right', is a partial search key item that is not an object.
1349  * \param bias How to bias search direction for duplicates
1350  *
1351  * \retval node on success.
1352  * \retval NULL if not found.
1353  */
1354 static struct rbtree_node *rb_find_initial(struct ao2_container_rbtree *self, void *obj_right, enum search_flags flags, enum equal_node_bias bias)
1355 {
1356         int cmp;
1357         enum search_flags sort_flags;
1358         struct rbtree_node *node;
1359         struct rbtree_node *next = NULL;
1360         ao2_sort_fn *sort_fn;
1361
1362         sort_flags = flags & OBJ_SEARCH_MASK;
1363         sort_fn = self->common.sort_fn;
1364
1365         /* Find node where normal search would find it. */
1366         node = self->root;
1367         if (!node) {
1368                 return NULL;
1369         }
1370         for (;;) {
1371                 if (!node->common.obj) {
1372                         /* Which direction do we go to find the node? */
1373                         if (rb_find_empty_direction(node, sort_fn, obj_right, sort_flags, bias)
1374                                 == GO_LEFT) {
1375                                 next = node->left;
1376                         } else {
1377                                 next = node->right;
1378                         }
1379                         if (!next) {
1380                                 switch (bias) {
1381                                 case BIAS_FIRST:
1382                                         /* Check successor node for match. */
1383                                         next = rb_node_next_full(node);
1384                                         break;
1385                                 case BIAS_EQUAL:
1386                                         break;
1387                                 case BIAS_LAST:
1388                                         /* Check previous node for match. */
1389                                         next = rb_node_prev_full(node);
1390                                         break;
1391                                 }
1392                                 if (next) {
1393                                         cmp = sort_fn(next->common.obj, obj_right, sort_flags);
1394                                         if (cmp == 0) {
1395                                                 /* Found the first/last matching node. */
1396                                                 return next;
1397                                         }
1398                                         next = NULL;
1399                                 }
1400
1401                                 /* No match found. */
1402                                 return next;
1403                         }
1404                 } else {
1405                         cmp = sort_fn(node->common.obj, obj_right, sort_flags);
1406                         if (cmp > 0) {
1407                                 next = node->left;
1408                         } else if (cmp < 0) {
1409                                 next = node->right;
1410                         } else {
1411                                 switch (bias) {
1412                                 case BIAS_FIRST:
1413                                         next = node->left;
1414                                         break;
1415                                 case BIAS_EQUAL:
1416                                         return node;
1417                                 case BIAS_LAST:
1418                                         next = node->right;
1419                                         break;
1420                                 }
1421                                 if (!next) {
1422                                         /* Found the first/last matching node. */
1423                                         return node;
1424                                 }
1425                         }
1426                         if (!next) {
1427                                 switch (bias) {
1428                                 case BIAS_FIRST:
1429                                         if (cmp < 0) {
1430                                                 /* Check successor node for match. */
1431                                                 next = rb_node_next_full(node);
1432                                         }
1433                                         break;
1434                                 case BIAS_EQUAL:
1435                                         break;
1436                                 case BIAS_LAST:
1437                                         if (cmp > 0) {
1438                                                 /* Check previous node for match. */
1439                                                 next = rb_node_prev_full(node);
1440                                         }
1441                                         break;
1442                                 }
1443                                 if (next) {
1444                                         cmp = sort_fn(next->common.obj, obj_right, sort_flags);
1445                                         if (cmp == 0) {
1446                                                 /* Found the first/last matching node. */
1447                                                 return next;
1448                                         }
1449                                 }
1450
1451                                 /* No match found. */
1452                                 return NULL;
1453                         }
1454                 }
1455                 node = next;
1456         }
1457 }
1458
1459 /*!
1460  * \internal
1461  * \brief Find the first rbtree container node in a traversal.
1462  * \since 12.0.0
1463  *
1464  * \param self Container to operate upon.
1465  * \param flags search_flags to control traversing the container
1466  * \param arg Comparison callback arg parameter.
1467  * \param state Traversal state to restart rbtree container traversal.
1468  *
1469  * \retval node-ptr of found node (Reffed).
1470  * \retval NULL when no node found.
1471  */
1472 static struct rbtree_node *rb_ao2_find_first(struct ao2_container_rbtree *self, enum search_flags flags, void *arg, struct rbtree_traversal_state *state)
1473 {
1474         struct rbtree_node *node;
1475         enum equal_node_bias bias;
1476
1477         if (self->common.destroying) {
1478                 /* Force traversal to be post order for tree destruction. */
1479                 flags = OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE | OBJ_ORDER_POST;
1480         }
1481
1482         memset(state, 0, sizeof(*state));
1483         state->arg = arg;
1484         state->flags = flags;
1485
1486         switch (flags & OBJ_SEARCH_MASK) {
1487         case OBJ_SEARCH_OBJECT:
1488         case OBJ_SEARCH_KEY:
1489         case OBJ_SEARCH_PARTIAL_KEY:
1490                 /* We are asked to do a directed search. */
1491                 state->sort_fn = self->common.sort_fn;
1492                 break;
1493         default:
1494                 /* Don't know, let's visit all nodes */
1495                 state->sort_fn = NULL;
1496                 break;
1497         }
1498
1499         if (!self->root) {
1500                 /* Tree is empty. */
1501                 return NULL;
1502         }
1503
1504         /* Find first traversal node. */
1505         switch (flags & OBJ_ORDER_MASK) {
1506         default:
1507         case OBJ_ORDER_ASCENDING:
1508                 if (!state->sort_fn) {
1509                         /* Find left most child. */
1510                         node = rb_node_most_left(self->root);
1511                         if (!node->common.obj) {
1512                                 node = rb_node_next_full(node);
1513                                 if (!node) {
1514                                         return NULL;
1515                                 }
1516                         }
1517                         break;
1518                 }
1519
1520                 /* Search for initial node. */
1521                 switch (self->common.options & AO2_CONTAINER_ALLOC_OPT_DUPS_MASK) {
1522                 case AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT:
1523                 case AO2_CONTAINER_ALLOC_OPT_DUPS_REPLACE:
1524                         if ((flags & OBJ_SEARCH_MASK) != OBJ_SEARCH_PARTIAL_KEY) {
1525                                 /* There are no duplicates allowed. */
1526                                 bias = BIAS_EQUAL;
1527                                 break;
1528                         }
1529                         /* Fall through */
1530                 default:
1531                 case AO2_CONTAINER_ALLOC_OPT_DUPS_ALLOW:
1532                 case AO2_CONTAINER_ALLOC_OPT_DUPS_OBJ_REJECT:
1533                         /* Find first duplicate node. */
1534                         bias = BIAS_FIRST;
1535                         break;
1536                 }
1537                 node = rb_find_initial(self, arg, flags, bias);
1538                 if (!node) {
1539                         return NULL;
1540                 }
1541                 break;
1542         case OBJ_ORDER_DESCENDING:
1543                 if (!state->sort_fn) {
1544                         /* Find right most child. */
1545                         node = rb_node_most_right(self->root);
1546                         if (!node->common.obj) {
1547                                 node = rb_node_prev_full(node);
1548                                 if (!node) {
1549                                         return NULL;
1550                                 }
1551                         }
1552                         break;
1553                 }
1554
1555                 /* Search for initial node. */
1556                 switch (self->common.options & AO2_CONTAINER_ALLOC_OPT_DUPS_MASK) {
1557                 case AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT:
1558                 case AO2_CONTAINER_ALLOC_OPT_DUPS_REPLACE:
1559                         if ((flags & OBJ_SEARCH_MASK) != OBJ_SEARCH_PARTIAL_KEY) {
1560                                 /* There are no duplicates allowed. */
1561                                 bias = BIAS_EQUAL;
1562                                 break;
1563                         }
1564                         /* Fall through */
1565                 default:
1566                 case AO2_CONTAINER_ALLOC_OPT_DUPS_ALLOW:
1567                 case AO2_CONTAINER_ALLOC_OPT_DUPS_OBJ_REJECT:
1568                         /* Find last duplicate node. */
1569                         bias = BIAS_LAST;
1570                         break;
1571                 }
1572                 node = rb_find_initial(self, arg, flags, bias);
1573                 if (!node) {
1574                         return NULL;
1575                 }
1576                 break;
1577         case OBJ_ORDER_PRE:
1578                 /* This is a tree structure traversal so we must visit all nodes. */
1579                 state->sort_fn = NULL;
1580
1581                 node = self->root;
1582
1583                 /* Find a non-empty node. */
1584                 while (!node->common.obj) {
1585                         node = rb_node_pre(node);
1586                         if (!node) {
1587                                 return NULL;
1588                         }
1589                 }
1590                 break;
1591         case OBJ_ORDER_POST:
1592                 /* This is a tree structure traversal so we must visit all nodes. */
1593                 state->sort_fn = NULL;
1594
1595                 /* Find the left most childless node. */
1596                 node = self->root;
1597                 for (;;) {
1598                         node = rb_node_most_left(node);
1599                         if (!node->right) {
1600                                 /* This node has no children. */
1601                                 break;
1602                         }
1603                         node = node->right;
1604                 }
1605
1606                 /* Find a non-empty node. */
1607                 while (!node->common.obj) {
1608                         node = rb_node_post(node);
1609                         if (!node) {
1610                                 return NULL;
1611                         }
1612                 }
1613                 break;
1614         }
1615
1616         /* We have the first traversal node */
1617         ao2_t_ref(node, +1, NULL);
1618         return node;
1619 }
1620
1621 /*!
1622  * \internal
1623  * \brief Find the next non-empty iteration node in the container.
1624  * \since 12.0.0
1625  *
1626  * \param self Container to operate upon.
1627  * \param node Previous node returned by the iterator.
1628  * \param flags search_flags to control iterating the container.
1629  *   Only AO2_ITERATOR_DESCENDING is useful by the method.
1630  *
1631  * \note The container is already locked.
1632  *
1633  * \retval node on success.
1634  * \retval NULL on error or no more nodes in the container.
1635  */
1636 static struct rbtree_node *rb_ao2_iterator_next(struct ao2_container_rbtree *self, struct rbtree_node *node, enum ao2_iterator_flags flags)
1637 {
1638         if (flags & AO2_ITERATOR_DESCENDING) {
1639                 if (!node) {
1640                         /* Find right most node. */
1641                         if (!self->root) {
1642                                 return NULL;
1643                         }
1644                         node = rb_node_most_right(self->root);
1645                         if (node->common.obj) {
1646                                 /* Found a non-empty node. */
1647                                 return node;
1648                         }
1649                 }
1650                 /* Find next non-empty node. */
1651                 node = rb_node_prev_full(node);
1652         } else {
1653                 if (!node) {
1654                         /* Find left most node. */
1655                         if (!self->root) {
1656                                 return NULL;
1657                         }
1658                         node = rb_node_most_left(self->root);
1659                         if (node->common.obj) {
1660                                 /* Found a non-empty node. */
1661                                 return node;
1662                         }
1663                 }
1664                 /* Find next non-empty node. */
1665                 node = rb_node_next_full(node);
1666         }
1667
1668         return node;
1669 }
1670
1671 /*!
1672  * \internal
1673  *
1674  * \brief Destroy this container.
1675  * \since 12.0.0
1676  *
1677  * \param self Container to operate upon.
1678  *
1679  * \return Nothing
1680  */
1681 static void rb_ao2_destroy(struct ao2_container_rbtree *self)
1682 {
1683         /* Check that the container no longer has any nodes */
1684         if (self->root) {
1685                 ast_log(LOG_ERROR, "Node ref leak.  Red-Black tree container still has nodes!\n");
1686                 ast_assert(0);
1687         }
1688 }
1689
1690 #if defined(AO2_DEBUG)
1691 /*!
1692  * \internal
1693  * \brief Display contents of the specified container.
1694  * \since 12.0.0
1695  *
1696  * \param self Container to dump.
1697  * \param where User data needed by prnt to determine where to put output.
1698  * \param prnt Print output callback function to use.
1699  * \param prnt_obj Callback function to print the given object's key. (NULL if not available)
1700  *
1701  * \return Nothing
1702  */
1703 static void rb_ao2_dump(struct ao2_container_rbtree *self, void *where, ao2_prnt_fn *prnt, ao2_prnt_obj_fn *prnt_obj)
1704 {
1705 #define FORMAT  "%16s, %16s, %16s, %16s, %5s, %16s, %s\n"
1706 #define FORMAT2 "%16p, %16p, %16p, %16p, %5s, %16p, "
1707
1708         struct rbtree_node *node;
1709
1710         prnt(where, FORMAT, "Node", "Parent", "Left", "Right", "Color", "Obj", "Key");
1711         for (node = self->root; node; node = rb_node_pre(node)) {
1712                 prnt(where, FORMAT2,
1713                         node,
1714                         node->parent,
1715                         node->left,
1716                         node->right,
1717                         node->is_red ? "Red" : "Black",
1718                         node->common.obj);
1719                 if (node->common.obj && prnt_obj) {
1720                         prnt_obj(node->common.obj, where, prnt);
1721                 }
1722                 prnt(where, "\n");
1723         }
1724
1725 #undef FORMAT
1726 #undef FORMAT2
1727 }
1728 #endif  /* defined(AO2_DEBUG) */
1729
1730 #if defined(AO2_DEBUG)
1731 /*!
1732  * \internal
1733  * \brief Display statistics of the specified container.
1734  * \since 12.0.0
1735  *
1736  * \param self Container to display statistics.
1737  * \param where User data needed by prnt to determine where to put output.
1738  * \param prnt Print output callback function to use.
1739  *
1740  * \note The container is already locked for reading.
1741  *
1742  * \return Nothing
1743  */
1744 static void rb_ao2_stats(struct ao2_container_rbtree *self, void *where, ao2_prnt_fn *prnt)
1745 {
1746         int idx;
1747
1748         for (idx = 0; idx < ARRAY_LEN(self->stats.fixup_insert_left); ++idx) {
1749                 prnt(where, "Number of left insert fixups case %d: %d\n", idx + 1,
1750                         self->stats.fixup_insert_left[idx]);
1751         }
1752         for (idx = 0; idx < ARRAY_LEN(self->stats.fixup_insert_right); ++idx) {
1753                 prnt(where, "Number of right insert fixups case %d: %d\n", idx + 1,
1754                         self->stats.fixup_insert_right[idx]);
1755         }
1756
1757         for (idx = 0; idx < ARRAY_LEN(self->stats.delete_children); ++idx) {
1758                 prnt(where, "Number of nodes deleted with %d children: %d\n", idx,
1759                         self->stats.delete_children[idx]);
1760         }
1761         for (idx = 0; idx < ARRAY_LEN(self->stats.fixup_delete_left); ++idx) {
1762                 prnt(where, "Number of left delete fixups case %d: %d\n", idx + 1,
1763                         self->stats.fixup_delete_left[idx]);
1764         }
1765         for (idx = 0; idx < ARRAY_LEN(self->stats.fixup_delete_right); ++idx) {
1766                 prnt(where, "Number of right delete fixups case %d: %d\n", idx + 1,
1767                         self->stats.fixup_delete_right[idx]);
1768         }
1769 }
1770 #endif  /* defined(AO2_DEBUG) */
1771
1772 #if defined(AO2_DEBUG)
1773 /*!
1774  * \internal
1775  * \brief Check the black height of the given node.
1776  * \since 12.0.0
1777  *
1778  * \param node Node to check black height.
1779  *
1780  * \retval black-height of node on success.
1781  * \retval -1 on error.  Node black height did not balance.
1782  */
1783 static int rb_check_black_height(struct rbtree_node *node)
1784 {
1785         int height_left;
1786         int height_right;
1787
1788         if (!node) {
1789                 /* A NULL child is a black node. */
1790                 return 0;
1791         }
1792
1793         height_left = rb_check_black_height(node->left);
1794         if (height_left < 0) {
1795                 return -1;
1796         }
1797         height_right = rb_check_black_height(node->right);
1798         if (height_right < 0) {
1799                 return -1;
1800         }
1801         if (height_left != height_right) {
1802                 ast_log(LOG_ERROR,
1803                         "Tree node black height of children does not match! L:%d != R:%d\n",
1804                         height_left, height_right);
1805                 return -1;
1806         }
1807         if (!node->is_red) {
1808                 /* The node itself is black. */
1809                 ++height_left;
1810         }
1811         return height_left;
1812 }
1813
1814 #endif  /* defined(AO2_DEBUG) */
1815
1816 #if defined(AO2_DEBUG)
1817 /*!
1818  * \internal
1819  * \brief Perform an integrity check on the specified container.
1820  * \since 12.0.0
1821  *
1822  * \param self Container to check integrity.
1823  *
1824  * \note The container is already locked for reading.
1825  *
1826  * \retval 0 on success.
1827  * \retval -1 on error.
1828  */
1829 static int rb_ao2_integrity(struct ao2_container_rbtree *self)
1830 {
1831         int res;
1832         int count_node;
1833         int count_obj;
1834         void *obj_last;
1835         struct rbtree_node *node;
1836
1837         res = 0;
1838
1839         count_node = 0;
1840         count_obj = 0;
1841
1842         /*
1843          * See the properties listed at struct rbtree_node definition.
1844          *
1845          * The rbtree properties 1 and 3 are not testable.
1846          *
1847          * Property 1 is not testable because we are not rebalancing at
1848          * this time so all nodes are either red or black.
1849          *
1850          * Property 3 is not testable because it is the definition of a
1851          * NULL child.
1852          */
1853         if (self->root) {
1854                 /* Check tree links. */
1855                 if (self->root->parent) {
1856                         if (self->root->parent == self->root) {
1857                                 ast_log(LOG_ERROR, "Tree root parent pointer points to itself!\n");
1858                         } else {
1859                                 ast_log(LOG_ERROR, "Tree root is not a root node!\n");
1860                         }
1861                         return -1;
1862                 }
1863                 if (self->root->is_red) {
1864                         /* Violation rbtree property 2. */
1865                         ast_log(LOG_ERROR, "Tree root is red!\n");
1866                         res = -1;
1867                 }
1868                 node = self->root;
1869                 do {
1870                         if (node->left) {
1871                                 if (node->left == node) {
1872                                         ast_log(LOG_ERROR, "Tree node's left pointer points to itself!\n");
1873                                         return -1;
1874                                 }
1875                                 if (node->left->parent != node) {
1876                                         ast_log(LOG_ERROR, "Tree node's left child does not link back!\n");
1877                                         return -1;
1878                                 }
1879                         }
1880                         if (node->right) {
1881                                 if (node->right == node) {
1882                                         ast_log(LOG_ERROR, "Tree node's right pointer points to itself!\n");
1883                                         return -1;
1884                                 }
1885                                 if (node->right->parent != node) {
1886                                         ast_log(LOG_ERROR, "Tree node's right child does not link back!\n");
1887                                         return -1;
1888                                 }
1889                         }
1890
1891                         /* Check red/black node flags. */
1892                         if (node->is_red) {
1893                                 /* A red node must have two black children or no children. */
1894                                 if (node->left && node->right) {
1895                                         /* Node has two children. */
1896                                         if (node->left->is_red) {
1897                                                 /* Violation rbtree property 4. */
1898                                                 ast_log(LOG_ERROR, "Tree node is red and its left child is red!\n");
1899                                                 res = -1;
1900                                         }
1901                                         if (node->right->is_red) {
1902                                                 /* Violation rbtree property 4. */
1903                                                 ast_log(LOG_ERROR, "Tree node is red and its right child is red!\n");
1904                                                 res = -1;
1905                                         }
1906                                 } else if (node->left || node->right) {
1907                                         /*
1908                                          * Violation rbtree property 4 if the child is red.
1909                                          * Violation rbtree property 5 if the child is black.
1910                                          */
1911                                         ast_log(LOG_ERROR, "Tree node is red and it only has one child!\n");
1912                                         res = -1;
1913                                 }
1914                         } else {
1915                                 /*
1916                                  * A black node must have two children, or one red child, or no
1917                                  * children.  If the black node has two children and only one of
1918                                  * them is red, that red child must have two children.
1919                                  */
1920                                 if (node->left && node->right) {
1921                                         /* Node has two children. */
1922                                         if (node->left->is_red != node->right->is_red) {
1923                                                 /* The children are not the same color. */
1924                                                 struct rbtree_node *red;
1925
1926                                                 if (node->left->is_red) {
1927                                                         red = node->left;
1928                                                 } else {
1929                                                         red = node->right;
1930                                                 }
1931                                                 if (!red->left || !red->right) {
1932                                                         /* Violation rbtree property 5. */
1933                                                         ast_log(LOG_ERROR,
1934                                                                 "Tree node is black and the red child does not have two children!\n");
1935                                                         res = -1;
1936                                                 }
1937                                         }
1938                                 } else if ((node->left && !node->left->is_red)
1939                                         || (node->right && !node->right->is_red)) {
1940                                         /* Violation rbtree property 5. */
1941                                         ast_log(LOG_ERROR, "Tree node is black and its only child is black!\n");
1942                                         res = -1;
1943                                 }
1944                         }
1945
1946                         /* Count nodes and objects. */
1947                         ++count_node;
1948                         if (node->common.obj) {
1949                                 ++count_obj;
1950                         }
1951
1952                         node = rb_node_pre(node);
1953                 } while (node);
1954
1955                 /* Check node key sort order. */
1956                 obj_last = NULL;
1957                 for (node = rb_node_most_left(self->root); node; node = rb_node_next(node)) {
1958                         if (!node->common.obj) {
1959                                 /* Node is empty. */
1960                                 continue;
1961                         }
1962
1963                         if (obj_last) {
1964                                 if (self->common.sort_fn(obj_last, node->common.obj, OBJ_SEARCH_OBJECT) > 0) {
1965                                         ast_log(LOG_ERROR, "Tree nodes are out of sorted order!\n");
1966                                         return -1;
1967                                 }
1968                         }
1969                         obj_last = node->common.obj;
1970                 }
1971
1972                 /* Completely check property 5 */
1973                 if (!res && rb_check_black_height(self->root) < 0) {
1974                         /* Violation rbtree property 5. */
1975                         res = -1;
1976                 }
1977         }
1978
1979         /* Check total obj count. */
1980         if (count_obj != ao2_container_count(&self->common)) {
1981                 ast_log(LOG_ERROR, "Total object count does not match ao2_container_count()!\n");
1982                 return -1;
1983         }
1984
1985         /* Check total node count. */
1986         if (count_node != self->common.nodes) {
1987                 ast_log(LOG_ERROR, "Total node count of %d does not match stat of %d!\n",
1988                         count_node, self->common.nodes);
1989                 return -1;
1990         }
1991
1992         return res;
1993 }
1994 #endif  /* defined(AO2_DEBUG) */
1995
1996 /*! rbtree container virtual method table. */
1997 static const struct ao2_container_methods v_table_rbtree = {
1998         .alloc_empty_clone = (ao2_container_alloc_empty_clone_fn) rb_ao2_alloc_empty_clone,
1999         .new_node = (ao2_container_new_node_fn) rb_ao2_new_node,
2000         .insert = (ao2_container_insert_fn) rb_ao2_insert_node,
2001         .traverse_first = (ao2_container_find_first_fn) rb_ao2_find_first,
2002         .traverse_next = (ao2_container_find_next_fn) rb_ao2_find_next,
2003         .iterator_next = (ao2_iterator_next_fn) rb_ao2_iterator_next,
2004         .destroy = (ao2_container_destroy_fn) rb_ao2_destroy,
2005 #if defined(AO2_DEBUG)
2006         .dump = (ao2_container_display) rb_ao2_dump,
2007         .stats = (ao2_container_statistics) rb_ao2_stats,
2008         .integrity = (ao2_container_integrity) rb_ao2_integrity,
2009 #endif  /* defined(AO2_DEBUG) */
2010 };
2011
2012 /*!
2013  * \brief Initialize a rbtree container.
2014  *
2015  * \param self Container to initialize.
2016  * \param options Container behaviour options (See enum ao2_container_opts)
2017  * \param sort_fn Pointer to a sort function.
2018  * \param cmp_fn Pointer to a compare function used by ao2_find.
2019  *
2020  * \return A pointer to a struct container.
2021  */
2022 static struct ao2_container *rb_ao2_container_init(struct ao2_container_rbtree *self,
2023         unsigned int options, ao2_sort_fn *sort_fn, ao2_callback_fn *cmp_fn)
2024 {
2025         if (!self) {
2026                 return NULL;
2027         }
2028
2029         self->common.v_table = &v_table_rbtree;
2030         self->common.sort_fn = sort_fn;
2031         self->common.cmp_fn = cmp_fn;
2032         self->common.options = options;
2033
2034 #ifdef AO2_DEBUG
2035         ast_atomic_fetchadd_int(&ao2.total_containers, 1);
2036 #endif  /* defined(AO2_DEBUG) */
2037
2038         return (struct ao2_container *) self;
2039 }
2040
2041 struct ao2_container *__ao2_container_alloc_rbtree(unsigned int ao2_options, unsigned int container_options,
2042         ao2_sort_fn *sort_fn, ao2_callback_fn *cmp_fn,
2043         const char *tag, const char *file, int line, const char *func)
2044 {
2045         struct ao2_container_rbtree *self;
2046
2047         if (!sort_fn) {
2048                 /* Sanity checks. */
2049                 ast_log(__LOG_ERROR, file, line, func, "Missing sort_fn()!\n");
2050                 return NULL;
2051         }
2052
2053         self = __ao2_alloc(sizeof(*self), container_destruct, ao2_options,
2054                 tag ?: __PRETTY_FUNCTION__, file, line, func);
2055         return rb_ao2_container_init(self, container_options, sort_fn, cmp_fn);
2056 }
2057