Commit 60670b80 authored by Michel Lespinasse's avatar Michel Lespinasse Committed by Linus Torvalds

rbtree: place easiest case first in rb_erase()

In rb_erase, move the easy case (node to erase has no more than
1 child) first. I feel the code reads easier that way.
Signed-off-by: default avatarMichel Lespinasse <walken@google.com>
Reviewed-by: default avatarRik van Riel <riel@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 7abc704a
...@@ -368,17 +368,28 @@ static void __rb_erase_color(struct rb_node *node, struct rb_node *parent, ...@@ -368,17 +368,28 @@ static void __rb_erase_color(struct rb_node *node, struct rb_node *parent,
void rb_erase(struct rb_node *node, struct rb_root *root) void rb_erase(struct rb_node *node, struct rb_root *root)
{ {
struct rb_node *child, *parent; struct rb_node *child = node->rb_right, *tmp = node->rb_left;
struct rb_node *parent;
int color; int color;
if (!node->rb_left) if (!tmp) {
child = node->rb_right; case1:
else if (!node->rb_right) /* Case 1: node to erase has no more than 1 child (easy!) */
child = node->rb_left;
else { parent = rb_parent(node);
color = rb_color(node);
if (child)
rb_set_parent(child, parent);
__rb_change_child(node, child, parent, root);
} else if (!child) {
/* Still case 1, but this time the child is node->rb_left */
child = tmp;
goto case1;
} else {
struct rb_node *old = node, *left; struct rb_node *old = node, *left;
node = node->rb_right; node = child;
while ((left = node->rb_left) != NULL) while ((left = node->rb_left) != NULL)
node = left; node = left;
...@@ -402,18 +413,8 @@ void rb_erase(struct rb_node *node, struct rb_root *root) ...@@ -402,18 +413,8 @@ void rb_erase(struct rb_node *node, struct rb_root *root)
node->__rb_parent_color = old->__rb_parent_color; node->__rb_parent_color = old->__rb_parent_color;
node->rb_left = old->rb_left; node->rb_left = old->rb_left;
rb_set_parent(old->rb_left, node); rb_set_parent(old->rb_left, node);
goto color;
} }
parent = rb_parent(node);
color = rb_color(node);
if (child)
rb_set_parent(child, parent);
__rb_change_child(node, child, parent, root);
color:
if (color == RB_BLACK) if (color == RB_BLACK)
__rb_erase_color(child, parent, root); __rb_erase_color(child, parent, root);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment