Rev 5056 | Rev 6102 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5056 | Rev 6082 | ||
---|---|---|---|
Line 49... | Line 49... | ||
49 | #define RB_ROOT (struct rb_root) { NULL, } |
49 | #define RB_ROOT (struct rb_root) { NULL, } |
50 | #define rb_entry(ptr, type, member) container_of(ptr, type, member) |
50 | #define rb_entry(ptr, type, member) container_of(ptr, type, member) |
Line 51... | Line 51... | ||
51 | 51 | ||
Line 52... | Line 52... | ||
52 | #define RB_EMPTY_ROOT(root) ((root)->rb_node == NULL) |
52 | #define RB_EMPTY_ROOT(root) ((root)->rb_node == NULL) |
53 | 53 | ||
54 | /* 'empty' nodes are nodes that are known not to be inserted in an rbree */ |
54 | /* 'empty' nodes are nodes that are known not to be inserted in an rbtree */ |
55 | #define RB_EMPTY_NODE(node) \ |
55 | #define RB_EMPTY_NODE(node) \ |
56 | ((node)->__rb_parent_color == (unsigned long)(node)) |
56 | ((node)->__rb_parent_color == (unsigned long)(node)) |
Line 83... | Line 83... | ||
83 | node->rb_left = node->rb_right = NULL; |
83 | node->rb_left = node->rb_right = NULL; |
Line 84... | Line 84... | ||
84 | 84 | ||
85 | *rb_link = node; |
85 | *rb_link = node; |
Line -... | Line 86... | ||
- | 86 | } |
|
- | 87 | ||
- | 88 | static inline void rb_link_node_rcu(struct rb_node *node, struct rb_node *parent, |
|
- | 89 | struct rb_node **rb_link) |
|
- | 90 | { |
|
- | 91 | node->__rb_parent_color = (unsigned long)parent; |
|
- | 92 | node->rb_left = node->rb_right = NULL; |
|
- | 93 | ||
- | 94 | rcu_assign_pointer(*rb_link, node); |
|
86 | } |
95 | } |
87 | 96 | ||
88 | #define rb_entry_safe(ptr, type, member) \ |
97 | #define rb_entry_safe(ptr, type, member) \ |
89 | ({ typeof(ptr) ____ptr = (ptr); \ |
98 | ({ typeof(ptr) ____ptr = (ptr); \ |
Line 90... | Line 99... | ||
90 | ____ptr ? rb_entry(____ptr, type, member) : NULL; \ |
99 | ____ptr ? rb_entry(____ptr, type, member) : NULL; \ |
91 | }) |
100 | }) |
92 | 101 | ||
93 | /** |
102 | /** |
94 | * rbtree_postorder_for_each_entry_safe - iterate over rb_root in post order of |
103 | * rbtree_postorder_for_each_entry_safe - iterate in post-order over rb_root of |
95 | * given type safe against removal of rb_node entry |
104 | * given type allowing the backing memory of @pos to be invalidated |
96 | * |
105 | * |
97 | * @pos: the 'type *' to use as a loop cursor. |
106 | * @pos: the 'type *' to use as a loop cursor. |
- | 107 | * @n: another 'type *' to use as temporary storage |
|
- | 108 | * @root: 'rb_root *' of the rbtree. |
|
- | 109 | * @field: the name of the rb_node field within 'type'. |
|
- | 110 | * |
|
- | 111 | * rbtree_postorder_for_each_entry_safe() provides a similar guarantee as |
|
- | 112 | * list_for_each_entry_safe() and allows the iteration to continue independent |
|
- | 113 | * of changes to @pos by the body of the loop. |
|
- | 114 | * |
|
98 | * @n: another 'type *' to use as temporary storage |
115 | * Note, however, that it cannot handle other modifications that re-order the |
99 | * @root: 'rb_root *' of the rbtree. |
116 | * rbtree it is iterating over. This includes calling rb_erase() on @pos, as |
100 | * @field: the name of the rb_node field within 'type'. |
117 | * rb_erase() may rebalance the tree, causing us to miss some nodes. |
101 | */ |
118 | */ |
102 | #define rbtree_postorder_for_each_entry_safe(pos, n, root, field) \ |
119 | #define rbtree_postorder_for_each_entry_safe(pos, n, root, field) \ |