Index: sys/sys/tree.h =================================================================== --- sys/sys/tree.h +++ sys/sys/tree.h @@ -477,11 +477,12 @@ continue; \ } \ if (!RB_RED_RIGHT(elm, field)) { \ - RB_FLIP_LEFT(elm, field); \ RB_ROTATE_LEFT(head, elm, child, field);\ if (RB_RED_LEFT(child, field)) \ - RB_FLIP_RIGHT(elm, field); \ - else if (RB_RED_RIGHT(child, field)) \ + RB_BITS(elm, field) ^= RB_RED_MASK; \ + else \ + RB_FLIP_LEFT(elm, field); \ + if (RB_RED_RIGHT(child, field)) \ RB_FLIP_LEFT(parent, field); \ elm = child; \ } \ @@ -497,11 +498,12 @@ continue; \ } \ if (!RB_RED_LEFT(elm, field)) { \ - RB_FLIP_RIGHT(elm, field); \ RB_ROTATE_RIGHT(head, elm, child, field);\ if (RB_RED_RIGHT(child, field)) \ - RB_FLIP_LEFT(elm, field); \ - else if (RB_RED_LEFT(child, field)) \ + RB_BITS(elm, field) ^= RB_RED_MASK; \ + else \ + RB_FLIP_RIGHT(elm, field); \ + if (RB_RED_LEFT(child, field)) \ RB_FLIP_RIGHT(parent, field); \ elm = child; \ } \ @@ -547,12 +549,13 @@ if (RB_RED_LEFT(sib, field)) \ RB_FLIP_LEFT(parent, field); \ else if (!RB_RED_RIGHT(sib, field)) { \ - RB_FLIP_LEFT(parent, field); \ RB_ROTATE_RIGHT(head, sib, elm, field); \ if (RB_RED_RIGHT(elm, field)) \ RB_FLIP_LEFT(sib, field); \ if (RB_RED_LEFT(elm, field)) \ - RB_FLIP_RIGHT(parent, field); \ + RB_BITS(parent, field) ^= RB_RED_MASK; \ + else \ + RB_FLIP_LEFT(parent, field); \ RB_BITS(elm, field) |= RB_RED_MASK; \ sib = elm; \ } \ @@ -577,12 +580,13 @@ if (RB_RED_RIGHT(sib, field)) \ RB_FLIP_RIGHT(parent, field); \ else if (!RB_RED_LEFT(sib, field)) { \ - RB_FLIP_RIGHT(parent, field); \ RB_ROTATE_LEFT(head, sib, elm, field); \ if (RB_RED_LEFT(elm, field)) \ RB_FLIP_RIGHT(sib, field); \ if (RB_RED_RIGHT(elm, field)) \ - RB_FLIP_LEFT(parent, field); \ + RB_BITS(parent, field) ^= RB_RED_MASK; \ + else \ + RB_FLIP_RIGHT(parent, field); \ RB_BITS(elm, field) |= RB_RED_MASK; \ sib = elm; \ } \