diff options
Diffstat (limited to 'tools/include/linux/rbtree.h')
| -rw-r--r-- | tools/include/linux/rbtree.h | 71 | 
1 files changed, 47 insertions, 24 deletions
diff --git a/tools/include/linux/rbtree.h b/tools/include/linux/rbtree.h index d83763a5327c..e03b1ea23e0e 100644 --- a/tools/include/linux/rbtree.h +++ b/tools/include/linux/rbtree.h @@ -31,25 +31,9 @@ struct rb_root {  	struct rb_node *rb_node;  }; -/* - * Leftmost-cached rbtrees. - * - * We do not cache the rightmost node based on footprint - * size vs number of potential users that could benefit - * from O(1) rb_last(). Just not worth it, users that want - * this feature can always implement the logic explicitly. - * Furthermore, users that want to cache both pointers may - * find it a bit asymmetric, but that's ok. - */ -struct rb_root_cached { -	struct rb_root rb_root; -	struct rb_node *rb_leftmost; -}; -  #define rb_parent(r)   ((struct rb_node *)((r)->__rb_parent_color & ~3))  #define RB_ROOT	(struct rb_root) { NULL, } -#define RB_ROOT_CACHED (struct rb_root_cached) { {NULL, }, NULL }  #define	rb_entry(ptr, type, member) container_of(ptr, type, member)  #define RB_EMPTY_ROOT(root)  (READ_ONCE((root)->rb_node) == NULL) @@ -71,12 +55,6 @@ extern struct rb_node *rb_prev(const struct rb_node *);  extern struct rb_node *rb_first(const struct rb_root *);  extern struct rb_node *rb_last(const struct rb_root *); -extern void rb_insert_color_cached(struct rb_node *, -				   struct rb_root_cached *, bool); -extern void rb_erase_cached(struct rb_node *node, struct rb_root_cached *); -/* Same as rb_first(), but O(1) */ -#define rb_first_cached(root) (root)->rb_leftmost -  /* Postorder iteration - always visit the parent after its children */  extern struct rb_node *rb_first_postorder(const struct rb_root *);  extern struct rb_node *rb_next_postorder(const struct rb_node *); @@ -84,8 +62,6 @@ extern struct rb_node *rb_next_postorder(const struct rb_node *);  /* Fast replacement of a single node without remove/rebalance/add/rebalance */  extern void rb_replace_node(struct rb_node *victim, struct rb_node *new,  			    struct rb_root *root); -extern void rb_replace_node_cached(struct rb_node *victim, struct rb_node *new, -				   struct rb_root_cached *root);  static inline void rb_link_node(struct rb_node *node, struct rb_node *parent,  				struct rb_node **rb_link) @@ -129,4 +105,51 @@ static inline void rb_erase_init(struct rb_node *n, struct rb_root *root)  	rb_erase(n, root);  	RB_CLEAR_NODE(n);  } + +/* + * Leftmost-cached rbtrees. + * + * We do not cache the rightmost node based on footprint + * size vs number of potential users that could benefit + * from O(1) rb_last(). Just not worth it, users that want + * this feature can always implement the logic explicitly. + * Furthermore, users that want to cache both pointers may + * find it a bit asymmetric, but that's ok. + */ +struct rb_root_cached { +	struct rb_root rb_root; +	struct rb_node *rb_leftmost; +}; + +#define RB_ROOT_CACHED (struct rb_root_cached) { {NULL, }, NULL } + +/* Same as rb_first(), but O(1) */ +#define rb_first_cached(root) (root)->rb_leftmost + +static inline void rb_insert_color_cached(struct rb_node *node, +					  struct rb_root_cached *root, +					  bool leftmost) +{ +	if (leftmost) +		root->rb_leftmost = node; +	rb_insert_color(node, &root->rb_root); +} + +static inline void rb_erase_cached(struct rb_node *node, +				   struct rb_root_cached *root) +{ +	if (root->rb_leftmost == node) +		root->rb_leftmost = rb_next(node); +	rb_erase(node, &root->rb_root); +} + +static inline void rb_replace_node_cached(struct rb_node *victim, +					  struct rb_node *new, +					  struct rb_root_cached *root) +{ +	if (root->rb_leftmost == victim) +		root->rb_leftmost = new; +	rb_replace_node(victim, new, &root->rb_root); +} +  #endif /* __TOOLS_LINUX_PERF_RBTREE_H */  |