Index: sys/sys/tree.h =================================================================== RCS file: /cvs/src/sys/sys/tree.h,v retrieving revision 1.25 diff -u -p -r1.25 tree.h --- sys/sys/tree.h 26 Sep 2016 08:08:51 -0000 1.25 +++ sys/sys/tree.h 5 Jun 2017 03:59:59 -0000 @@ -814,6 +814,9 @@ void *_rb_prev(const struct rb_type *, v void *_rb_left(const struct rb_type *, void *); void *_rb_right(const struct rb_type *, void *); void *_rb_parent(const struct rb_type *, void *); +void _rb_set_left(const struct rb_type *, void *, void *); +void _rb_set_right(const struct rb_type *, void *, void *); +void _rb_set_parent(const struct rb_type *, void *, void *); void *_rb_color(const struct rb_type *, void *); void _rb_poison(const struct rb_type *, void *, unsigned long); int _rb_check(const struct rb_type *, void *, unsigned long); @@ -908,6 +911,24 @@ _name##_RBT_PARENT(struct _type *elm) } \ \ __unused static inline void \ +_name##_RBT_SET_LEFT(struct _type *elm, struct _type *left) \ +{ \ + return _rb_set_left(_name##_RBT_TYPE, elm, left); \ +} \ + \ +__unused static inline void \ +_name##_RBT_SET_RIGHT(struct _type *elm, struct _type *right) \ +{ \ + return _rb_set_right(_name##_RBT_TYPE, elm, right); \ +} \ + \ +__unused static inline void \ +_name##_RBT_SET_PARENT(struct _type *elm, struct _type *parent) \ +{ \ + return _rb_set_parent(_name##_RBT_TYPE, elm, parent); \ +} \ + \ +__unused static inline void \ _name##_RBT_POISON(struct _type *elm, unsigned long poison) \ { \ return _rb_poison(_name##_RBT_TYPE, elm, poison); \ @@ -959,6 +980,9 @@ RBT_GENERATE_INTERNAL(_name, _type, _fie #define RBT_LEFT(_name, _elm) _name##_RBT_LEFT(_elm) #define RBT_RIGHT(_name, _elm) _name##_RBT_RIGHT(_elm) #define RBT_PARENT(_name, _elm) _name##_RBT_PARENT(_elm) +#define RBT_SET_LEFT(_name, _elm, _l) _name##_RBT_SET_LEFT(_elm, _l) +#define RBT_SET_RIGHT(_name, _elm, _r) _name##_RBT_SET_RIGHT(_elm, _r) +#define RBT_SET_PARENT(_name, _elm, _p) _name##_RBT_SET_PARENT(_elm, _p) #define RBT_POISON(_name, _elm, _p) _name##_RBT_POISON(_elm, _p) #define RBT_CHECK(_name, _elm, _p) _name##_RBT_CHECK(_elm, _p) Index: sys/kern/subr_tree.c =================================================================== RCS file: /cvs/src/sys/kern/subr_tree.c,v retrieving revision 1.6 diff -u -p -r1.6 subr_tree.c --- sys/kern/subr_tree.c 20 Sep 2016 01:11:27 -0000 1.6 +++ sys/kern/subr_tree.c 5 Jun 2017 03:59:59 -0000 @@ -593,6 +593,33 @@ _rb_parent(const struct rb_type *t, void } void +_rb_set_left(const struct rb_type *t, void *node, void *left) +{ + struct rb_entry *rbe = rb_n2e(t, node); + struct rb_entry *rbl = (left == NULL) ? NULL : rb_n2e(t, left); + + RBE_LEFT(rbe) = rbl; +} + +void +_rb_set_right(const struct rb_type *t, void *node, void *right) +{ + struct rb_entry *rbe = rb_n2e(t, node); + struct rb_entry *rbr = (right == NULL) ? NULL : rb_n2e(t, right); + + RBE_RIGHT(rbe) = rbr; +} + +void +_rb_set_parent(const struct rb_type *t, void *node, void *parent) +{ + struct rb_entry *rbe = rb_n2e(t, node); + struct rb_entry *rbp = (parent == NULL) ? NULL : rb_n2e(t, parent); + + RBE_PARENT(rbe) = rbp; +} + +void _rb_poison(const struct rb_type *t, void *node, unsigned long poison) { struct rb_entry *rbe = rb_n2e(t, node); Index: share/man/man9/RBT_INIT.9 =================================================================== RCS file: /cvs/src/share/man/man9/RBT_INIT.9,v retrieving revision 1.5 diff -u -p -r1.5 RBT_INIT.9 --- share/man/man9/RBT_INIT.9 15 Sep 2016 06:07:22 -0000 1.5 +++ share/man/man9/RBT_INIT.9 5 Jun 2017 03:59:59 -0000 @@ -61,6 +61,9 @@ .Nm RBT_LEFT , .Nm RBT_RIGHT , .Nm RBT_PARENT , +.Nm RBT_SET_LEFT , +.Nm RBT_SET_RIGHT , +.Nm RBT_SET_PARENT , .Nm RBT_FOREACH , .Nm RBT_FOREACH_SAFE , .Nm RBT_FOREACH_REVERSE , @@ -114,6 +117,12 @@ .Fn RBT_RIGHT "NAME" "struct TYPE *elm" .Ft struct TYPE * .Fn RBT_PARENT "NAME" "struct TYPE *elm" +.Ft void +.Fn RBT_SET_LEFT "NAME" "struct TYPE *elm" "struct TYPE *left" +.Ft void +.Fn RBT_SET_RIGHT "NAME" "struct TYPE *elm" "struct TYPE *right" +.Ft void +.Fn RBT_SET_PARENT "NAME" "struct TYPE *elm" "struct TYPE *parent" .Fo RBT_FOREACH .Fa "VARNAME" .Fa "NAME" @@ -335,6 +344,30 @@ returns a pointer to the parent element .Fa elm in a red-black tree of type .Fa NAME . +.Pp +.Fn RBT_SET_LEFT +sets the left child pointer of element +.Fa elm +to +.Fa left +in a red-black tree of type +.Fa NAME . +.Pp +.Fn RBT_SET_RIGHT +sets the right child pointer of element +.Fa elm +to +.Fa right +in a red-black tree of type +.Fa NAME . +.Pp +.Fn RBT_SET_PARENT +sets the parent pointer of element +.Fa elm +to +.Fa parent +in a red-black tree of type +.Fa NAME . .Ss Red-Black Tree Iterators The .Fn RBT_FOREACH @@ -418,6 +451,9 @@ value. .Fn RBT_LEFT , .Fn RBT_RIGHT , .Fn RBT_PARENT , +.Fn RBT_SET_LEFT , +.Fn RBT_SET_RIGHT , +.Fn RBT_SET_PARENT , .Fn RBT_FOREACH , .Fn RBT_FOREACH_REVERSE , .Fn RBT_FOREACH_SAFE ,