【问题标题】:Parent pointer in linux kernel RBTreelinux内核RBTree中的父指针
【发布时间】: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


【解决方案1】:

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

在某些情况下,它们在内存页面管理中使用最低位的方式相同——它们只是使用最低位,假设它始终对齐并且必须为 0;因此将其设置为 1 不会改变任何事情。

祝你好运。

【讨论】:

    【解决方案2】:

    我不知道之前有人问过这个问题。

    Red black node's struct alignment in linux kernel

    这正是我需要的详细描述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多