Index: sys/sys/tree.h =================================================================== --- sys/sys/tree.h +++ sys/sys/tree.h @@ -340,6 +340,7 @@ #define RB_RED_MASK ((__uintptr_t)3) #define RB_FLIP_LEFT(elm, field) (RB_BITS(elm, field) ^= RB_RED_L) #define RB_FLIP_RIGHT(elm, field) (RB_BITS(elm, field) ^= RB_RED_R) +#define RB_FLIP_ALL(elm, field) (RB_BITS(elm, field) ^= RB_RED_MASK) #define RB_RED_LEFT(elm, field) ((RB_BITS(elm, field) & RB_RED_L) != 0) #define RB_RED_RIGHT(elm, field) ((RB_BITS(elm, field) & RB_RED_R) != 0) #define RB_PARENT(elm, field) ((__typeof(RB_UP(elm, field))) \ @@ -348,8 +349,8 @@ #define RB_EMPTY(head) (RB_ROOT(head) == NULL) #define RB_SET_PARENT(dst, src, field) do { \ - RB_BITS(dst, field) &= RB_RED_MASK; \ - RB_BITS(dst, field) |= (__uintptr_t)src; \ + RB_BITS(dst, field) = (__uintptr_t)src | \ + (RB_BITS(dst, field) & RB_RED_MASK); \ } while (/*CONSTCOND*/ 0) #define RB_SET(elm, parent, field) do { \ @@ -487,13 +488,14 @@ continue; \ } \ if (!RB_RED_RIGHT(elm, field)) { \ - RB_FLIP_LEFT(elm, field); \ /* coverity[uninit_use] */ \ 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)) \ + if (RB_RED_RIGHT(child, field)) \ RB_FLIP_LEFT(parent, field); \ + if (RB_RED_LEFT(child, field)) \ + RB_FLIP_ALL(elm, field); \ + else \ + RB_FLIP_LEFT(elm, field); \ elm = child; \ } \ RB_ROTATE_RIGHT(head, parent, elm, field); \ @@ -509,13 +511,14 @@ continue; \ } \ if (!RB_RED_LEFT(elm, field)) { \ - RB_FLIP_RIGHT(elm, field); \ /* coverity[uninit_use] */ \ 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)) \ + if (RB_RED_LEFT(child, field)) \ RB_FLIP_RIGHT(parent, field); \ + if (RB_RED_RIGHT(child, field)) \ + RB_FLIP_ALL(elm, field); \ + else \ + RB_FLIP_RIGHT(elm, field); \ elm = child; \ } \ RB_ROTATE_LEFT(head, parent, elm, field); \