【发布时间】:2014-01-12 15:29:26
【问题描述】:
我想知道如何维护父指针?据我了解,linux rbtree 中有一个变量 unsigned long 存储父指针和颜色节点的地址?我无法理解如果不修改父指针,即使它的 1 位颜色字段也是如此。
rbtree.h 中的示例用法
struct rb_node
{
unsigned long rb_parent_color;
#define RB_RED 0
#define RB_BLACK 1
struct rb_node *rb_right;
struct rb_node *rb_left;
} __attribute__((aligned(sizeof(long))));
static void __rb_rotate_left(struct rb_node *node, struct rb_root *root)
{
struct rb_node *right = node->rb_right;
struct rb_node *parent = rb_parent(node);
...
...
...
}
The macros are defined as
#define rb_parent(r) ((struct rb_node *)((r)->rb_parent_color & ~3))
#define rb_color(r) ((r)->rb_parent_color & 1)
我无法理解这两个宏,这与我之前的问题有关。 rb_parent_color 很长,它保存了父指针的地址和节点的颜色(从 rb_color 宏中可以看出。 我要问的是这个指针屏蔽逻辑是如何工作的?
【问题讨论】:
-
kernelnewbies.org 可能是一个更好的地方问......
-
编辑了我的问题。希望这可以减少混乱并更具体。
标签: c linux linux-kernel red-black-tree