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 | |