Strip tag bits from closure pointers before trying to deference them.
[ghc-hetmet.git] / rts / STM.c
index b5dcc54..b9be955 100644 (file)
--- 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;
@@ -388,8 +388,8 @@ static void unpark_tso(Capability *cap, StgTSO *tso) {
 
 static void unpark_waiters_on(Capability *cap, StgTVar *s) {
   StgTVarWatchQueue *q;
-  TRACE("unpark_waiters_on tvar=%p", s);
   StgTVarWatchQueue *trail;
+  TRACE("unpark_waiters_on tvar=%p", s);
   // unblock TSOs in reverse order, to be a bit fairer (#2319)
   for (q = s -> first_watch_queue_entry, trail = q;
        q != END_STM_WATCH_QUEUE;
@@ -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;
   }