From 32190538d78bee271d5936a63738abed02849e1f Mon Sep 17 00:00:00 2001 From: Justin Sobota Date: Wed, 8 Jul 2015 16:46:12 -0400 Subject: [PATCH] tree.h cache-instrumented macros were invalidating NULL pointers in some cases --- src/rm.c | 4 ++-- util/tree.h | 26 ++++++++++++++------------ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/rm.c b/src/rm.c index 6caf08b..d95d87e 100644 --- a/src/rm.c +++ b/src/rm.c @@ -1691,7 +1691,7 @@ Rm_Handle Rm_init(const Rm_InitCfg *initCfg, int32_t *result) goto errorExit; } - if (initCfg->instType == Rm_instType_SHARED_SERVER) { + if (rmInst->instType == Rm_instType_SHARED_SERVER) { /* Writeback instance and trees for other cores */ rmPolicyValidInstTreeWb(rmInst->validInstTree); rmAllocatorTreeWb(rmInst->allocatorTree); @@ -1701,7 +1701,7 @@ Rm_Handle Rm_init(const Rm_InitCfg *initCfg, int32_t *result) /* Create the instance's task blocking mechanism */ rmInst->blockHandle = Rm_osalTaskBlockCreate(); } - /* else: fall through */ + /* else: just return handle */ return((Rm_Handle)rmInst); diff --git a/util/tree.h b/util/tree.h index 8ada42d..c271390 100644 --- a/util/tree.h +++ b/util/tree.h @@ -719,31 +719,33 @@ name##_RB_MINMAX(struct name *head, int val) \ tmp = RB_RIGHT(tmp, field); \ } \ return (parent); \ -} \ - \ +} \ + \ /* ARGSUSED */ \ attr struct type * \ name##_RB_NEXT_CACHED(struct type *elm) \ { \ - inv(elm); \ + inv(elm); \ if (RB_RIGHT(elm, field)) { \ elm = RB_RIGHT(elm, field); \ - inv(elm); \ + inv(elm); \ while (RB_LEFT(elm, field)) { \ elm = RB_LEFT(elm, field); \ - inv(elm); \ - } \ + inv(elm); \ + } \ } else { \ - inv(RB_PARENT(elm, field)); \ + if (RB_PARENT(elm, field)) \ + inv(RB_PARENT(elm, field)); \ if (RB_PARENT(elm, field) && \ - (elm == RB_LEFT(RB_PARENT(elm, field), field))) \ + (elm == RB_LEFT(RB_PARENT(elm, field), field))) \ elm = RB_PARENT(elm, field); \ else { \ while (RB_PARENT(elm, field) && \ - (elm == RB_RIGHT(RB_PARENT(elm, field), field))) {\ + (elm == RB_RIGHT(RB_PARENT(elm, field), field))) {\ elm = RB_PARENT(elm, field); \ - inv(RB_PARENT(elm, field)); \ - } \ + if (RB_PARENT(elm, field)) \ + inv(RB_PARENT(elm, field)); \ + } \ elm = RB_PARENT(elm, field); \ } \ } \ @@ -756,8 +758,8 @@ name##_RB_MINMAX_CACHED(struct name *head, int val) \ struct type *tmp = RB_ROOT(head); \ struct type *parent = NULL; \ while (tmp) { \ + inv(tmp); \ parent = tmp; \ - inv(tmp); \ if (val < 0) \ tmp = RB_LEFT(tmp, field); \ else \ -- 2.39.2