Linux内核RBTree中的父指针

时间:2013-12-24 11:23:38

标签: c linux linux-kernel red-black-tree

我有兴趣知道如何保持父指针?据我所知,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是long,它保存父指针的地址和节点的颜色(从rb_color宏中显而易见)。 我要问的是这个指针屏蔽逻辑是如何工作的?

2 个答案:

答案 0 :(得分:3)

作为假设得到我的答案,我现在懒得检查它:-) 实际上最低位未使用,因为地址始终对齐,因此最低位必须为0;

他们在内存页面管理中使用最低位的方式相同 - 它们只使用最低位,假设它始终对齐且必须为0;因此将其设置为1不会改变事物。

祝你好运。

答案 1 :(得分:0)

我不知道早些时候曾经问过这个问题。

Red black node's struct alignment in linux kernel

这正是我需要的详细说明。