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>
25typedef unsigned long long xnkey_t;
27static 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)
46static 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))
55void xntree_cleanup(
struct rb_root *t,
void *cookie,
56 void (*destroy)(
void *cookie,
struct xnid *
id));
58int xnid_enter(
struct rb_root *t,
struct xnid *xnid, xnkey_t key);
60static inline xnkey_t xnid_key(
struct xnid *i)
66struct 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;
84static 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);