17#ifndef _LINUX_RBTREE_H
18#define _LINUX_RBTREE_H
23#include <linux/stddef.h>
26#define rb_parent(r) ((struct rb_node *)((r)->__rb_parent_color & ~3))
28#define rb_entry(ptr, type, member) container_of(ptr, type, member)
30#define RB_EMPTY_ROOT(root) (READ_ONCE((root)->rb_node) == NULL)
39#define RB_EMPTY_NODE(node) \
40 ((node)->__rb_parent_color == (uintptr_t)(node))
41#define RB_CLEAR_NODE(node) \
42 ((node)->__rb_parent_color = (uintptr_t)(node))
44#define RB_EMPTY_LINKED_NODE(lnode) RB_EMPTY_NODE(&(lnode)->node)
45#define RB_CLEAR_LINKED_NODE(lnode) ({ \
46 RB_CLEAR_NODE(&(lnode)->node); \
47 (lnode)->prev = (lnode)->next = NULL; \
116#define rb_entry_safe(ptr, type, member) \
117 ({ typeof(ptr) ____ptr = (ptr); \
118 ____ptr ? rb_entry(____ptr, type, member) : NULL; \
138#define rbtree_postorder_for_each_entry_safe(pos, n, root, field) \
139 for (pos = rb_entry_safe(rb_first_postorder(root), typeof(*pos), field); \
140 pos && ({ n = rb_entry_safe(rb_next_postorder(&pos->field), \
141 typeof(*pos), field); 1; }); \
145#define rb_first_cached(root) (root)->rb_leftmost
147static inline void rb_insert_color_cached(
struct rb_node *
node,
170static inline void rb_replace_node_cached(
struct rb_node *victim,
174 if (
root->rb_leftmost == victim)
175 root->rb_leftmost =
new;
209 bool leftmost =
true;
222 rb_insert_color_cached(
node, tree, leftmost);
248#define __node_2_linked_node(_n) \
249 rb_entry((_n), struct rb_node_linked, node)
260 if (link == &
parent->rb_left) {
287 __rb_add(&
node->node, &tree->
rb_root, less, rb_link_linked_node);
307 __rb_add(
node, tree, less, rb_link_noop);
323 bool leftmost =
true;
343 rb_insert_color_cached(
node, tree, leftmost);
426rb_find(
const void *key,
const struct rb_root *tree,
427 int (*
cmp)(
const void *key,
const struct rb_node *))
457rb_find_rcu(
const void *key,
const struct rb_root *tree,
458 int (*
cmp)(
const void *key,
const struct rb_node *))
485rb_find_first(
const void *key,
const struct rb_root *tree,
486 int (*
cmp)(
const void *key,
const struct rb_node *))
515rb_next_match(
const void *key,
struct rb_node *
node,
516 int (*
cmp)(
const void *key,
const struct rb_node *))
531#define rb_for_each(node, key, tree, cmp) \
532 for ((node) = rb_find_first((key), (tree), (cmp)); \
533 (node); (node) = rb_next_match((key), (node), (cmp)))
unsigned int uintptr_t
Definition stdint.h:94
#define NULL
Definition actypes.h:561
#define __always_inline
Definition compiler_attributes.h:55
struct kobject * parent
Definition kobject.h:91
void int node
Definition kthread.h:31
int const struct list_head const struct list_head struct list_head list_cmp_func_t cmp
Definition list_sort.h:13
void rb_replace_node_rcu(struct rb_node *victim, struct rb_node *new, struct rb_root *root)
struct rb_node * rb_next_postorder(const struct rb_node *)
struct rb_node * rb_next(const struct rb_node *)
bool rb_erase_linked(struct rb_node_linked *, struct rb_root_linked *)
#define __node_2_linked_node(_n)
Definition rbtree.h:248
struct rb_node * rb_first_postorder(const struct rb_root *)
void rb_insert_color(struct rb_node *, struct rb_root *)
void rb_erase(struct rb_node *, struct rb_root *)
struct rb_node * rb_prev(const struct rb_node *)
void rb_replace_node(struct rb_node *victim, struct rb_node *new, struct rb_root *root)
#define rcu_assign_pointer(p, v)
Definition rcupdate.h:51
#define rcu_dereference_raw(p)
Definition rcupdate.h:42
Definition rbtree_types.h:28
struct rb_node_linked * prev
Definition rbtree_types.h:30
struct rb_node_linked * next
Definition rbtree_types.h:31
Definition rbtree_types.h:21
struct rb_node * rb_left
Definition rbtree_types.h:24
struct rb_node * rb_right
Definition rbtree_types.h:23
Definition rbtree_types.h:48
struct rb_root rb_root
Definition rbtree_types.h:49
Definition rbtree_types.h:57
struct rb_node_linked * rb_leftmost
Definition rbtree_types.h:59
struct rb_root rb_root
Definition rbtree_types.h:58
Definition rbtree_types.h:34
struct rb_node * rb_node
Definition rbtree_types.h:35
TTY * root
Definition tty.cpp:47