我有兴趣知道如何保持父指针?据我所知,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宏中显而易见)。 我要问的是这个指针屏蔽逻辑是如何工作的?
答案 0 :(得分:3)
作为假设得到我的答案,我现在懒得检查它:-) 实际上最低位未使用,因为地址始终对齐,因此最低位必须为0;
他们在内存页面管理中使用最低位的方式相同 - 它们只使用最低位,假设它始终对齐且必须为0;因此将其设置为1不会改变事物。
祝你好运。答案 1 :(得分:0)