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