diff --git a/rts/PrimOps.cmm b/rts/PrimOps.cmm index f1448f41701573ff458e67ce78a6c840550b0965..98c90e805a4667f223e8c377bfa3041e82aa7dba 100644 --- a/rts/PrimOps.cmm +++ b/rts/PrimOps.cmm @@ -827,7 +827,9 @@ stg_atomicModifyMutVarzuzh ( gcptr mv, gcptr f ) StgMutVar_var(mv) = z; #endif - if (GET_INFO(mv) == stg_MUT_VAR_CLEAN_info) { + W_ info; + info = %relaxed GET_INFO(mv); + if (info == stg_MUT_VAR_CLEAN_info) { ccall dirty_MUT_VAR(BaseReg "ptr", mv "ptr", x "ptr"); } diff --git a/rts/include/rts/storage/ClosureMacros.h b/rts/include/rts/storage/ClosureMacros.h index a5bb71ce1af945fb46e824c38172323c1c94c58a..1c9d050b97d175bca99e2b7f2b1b52a8d0d4375f 100644 --- a/rts/include/rts/storage/ClosureMacros.h +++ b/rts/include/rts/storage/ClosureMacros.h @@ -184,7 +184,7 @@ EXTERN_INLINE StgHalfWord GET_TAG(const StgClosure *con) // Use when changing a closure from one kind to another #define OVERWRITE_INFO(c, new_info) \ OVERWRITING_CLOSURE((StgClosure *)(c)); \ - SET_INFO((StgClosure *)(c), (new_info)); \ + SET_INFO_RELAXED((StgClosure *)(c), (new_info)); \ LDV_RECORD_CREATE(c); /* ----------------------------------------------------------------------------- diff --git a/rts/sm/Storage.c b/rts/sm/Storage.c index 8aa52df00dee1b28adcb9808fa1a5152f060faf8..14a858e141ed6c14d575790e2ea5c4c871896d44 100644 --- a/rts/sm/Storage.c +++ b/rts/sm/Storage.c @@ -1440,7 +1440,7 @@ dirty_MUT_VAR(StgRegTable *reg, StgMutVar *mvar, StgClosure *old) Capability *cap = regTableToCapability(reg); // No barrier required here as no other heap object fields are read. See // Note [Heap memory barriers] in SMP.h. - SET_INFO((StgClosure*) mvar, &stg_MUT_VAR_DIRTY_info); + SET_INFO_RELAXED((StgClosure*) mvar, &stg_MUT_VAR_DIRTY_info); recordClosureMutated(cap, (StgClosure *) mvar); IF_NONMOVING_WRITE_BARRIER_ENABLED { // See Note [Dirty flags in the non-moving collector] in NonMoving.c @@ -1462,7 +1462,7 @@ dirty_TVAR(Capability *cap, StgTVar *p, // No barrier required here as no other heap object fields are read. See // Note [Heap memory barriers] in SMP.h. if (RELAXED_LOAD(&p->header.info) == &stg_TVAR_CLEAN_info) { - SET_INFO((StgClosure*) p, &stg_TVAR_DIRTY_info); + SET_INFO_RELAXED((StgClosure*) p, &stg_TVAR_DIRTY_info); recordClosureMutated(cap,(StgClosure*)p); IF_NONMOVING_WRITE_BARRIER_ENABLED { // See Note [Dirty flags in the non-moving collector] in NonMoving.c