From 9ecd4a3e69829f4c4ca6207043256cd40146556d Mon Sep 17 00:00:00 2001 From: "Ben.Lippmeier@anu.edu.au" Date: Tue, 24 Feb 2009 10:13:46 +0000 Subject: [PATCH] Strip tag bits from closure pointers before trying to deference them. --- rts/STM.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rts/STM.c b/rts/STM.c index 9d93972..b9be955 100644 --- a/rts/STM.c +++ b/rts/STM.c @@ -306,7 +306,7 @@ static StgClosure *lock_tvar(StgTRecHeader *trec, do { do { result = s -> current_value; - } while (GET_INFO(result) == &stg_TREC_HEADER_info); + } while (GET_INFO(UNTAG_CLOSURE(result)) == &stg_TREC_HEADER_info); } while (cas((void *)&(s -> current_value), (StgWord)result, (StgWord)trec) != (StgWord)result); return result; @@ -1573,7 +1573,7 @@ static StgClosure *read_current_value(StgTRecHeader *trec STG_UNUSED, StgTVar *t result = tvar -> current_value; #if defined(STM_FG_LOCKS) - while (GET_INFO(result) == &stg_TREC_HEADER_info) { + while (GET_INFO(UNTAG_CLOSURE(result)) == &stg_TREC_HEADER_info) { TRACE("%p : read_current_value(%p) saw %p", trec, tvar, result); result = tvar -> current_value; } -- 1.7.10.4