1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __PERF_RBLIST_H 3 #define __PERF_RBLIST_H 4 5 #include <linux/rbtree.h> 6 #include <stdbool.h> 7 8 /* 9 * create node structs of the form: 10 * struct my_node { 11 * struct rb_node rb_node; 12 * ... my data ... 13 * }; 14 * 15 * create list structs of the form: 16 * struct mylist { 17 * struct rblist rblist; 18 * ... my data ... 19 * }; 20 */ 21 22 struct rblist { 23 struct rb_root_cached entries; 24 unsigned int nr_entries; 25 26 int (*node_cmp)(struct rb_node *rbn, const void *entry); 27 struct rb_node *(*node_new)(struct rblist *rlist, const void *new_entry); 28 void (*node_delete)(struct rblist *rblist, struct rb_node *rb_node); 29 }; 30 31 void rblist__init(struct rblist *rblist); 32 void rblist__exit(struct rblist *rblist); 33 void rblist__delete(struct rblist *rblist); 34 int rblist__add_node(struct rblist *rblist, const void *new_entry); 35 void rblist__remove_node(struct rblist *rblist, struct rb_node *rb_node); 36 struct rb_node *rblist__find(struct rblist *rblist, const void *entry); 37 struct rb_node *rblist__findnew(struct rblist *rblist, const void *entry); 38 struct rb_node *rblist__entry(const struct rblist *rblist, unsigned int idx); 39 40 static inline bool rblist__empty(const struct rblist *rblist) 41 { 42 return rblist->nr_entries == 0; 43 } 44 45 static inline unsigned int rblist__nr_entries(const struct rblist *rblist) 46 { 47 return rblist->nr_entries; 48 } 49 50 #endif /* __PERF_RBLIST_H */ 51