18 #ifndef _COBALT_KERNEL_TREE_H 19 #define _COBALT_KERNEL_TREE_H 21 #include <linux/errno.h> 22 #include <linux/rbtree.h> 23 #include <cobalt/kernel/assert.h> 25 typedef unsigned long long xnkey_t;
27 static inline xnkey_t PTR_KEY(
void *p)
29 return (xnkey_t)(long)p;
37 #define xnid_entry(ptr, type, member) \ 39 typeof(ptr) _ptr = (ptr); \ 40 (_ptr ? container_of(_ptr, type, member.link) : NULL); \ 43 #define xnid_next_entry(ptr, member) \ 44 xnid_entry(rb_next(&ptr->member.link), typeof(*ptr), member) 46 static inline void xntree_init(
struct rb_root *t)
51 #define xntree_for_each_entry(pos, root, member) \ 52 for (pos = xnid_entry(rb_first(root), typeof(*pos), member); \ 53 pos; pos = xnid_next_entry(pos, member)) 55 void xntree_cleanup(
struct rb_root *t,
void *cookie,
56 void (*destroy)(
void *cookie,
struct xnid *
id));
58 int xnid_enter(
struct rb_root *t,
struct xnid *xnid, xnkey_t key);
60 static inline xnkey_t xnid_key(
struct xnid *i)
66 struct xnid *xnid_fetch(
struct rb_root *t, xnkey_t key)
68 struct rb_node *node = t->rb_node;
71 struct xnid *i = container_of(node,
struct xnid, link);
75 else if (key > i->key)
76 node = node->rb_right;
84 static inline int xnid_remove(
struct rb_root *t,
struct xnid *xnid)
86 #ifdef CONFIG_XENO_OPT_DEBUG_COBALT 87 if (xnid_fetch(t, xnid->key) != xnid)
90 rb_erase(&xnid->link, t);