summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2019-09-28 17:52:48 +0000
committerMoritz Angermann <moritz.angermann@gmail.com>2020-09-18 07:53:02 +0000
commitfaa9d602e5a8afd2e4deeb0c7a79cb8959e12075 (patch)
tree841764671685f33fc9fe011ca58272ad3af446ca
parent1527a70f88d94627fd6c672b7cb5573bf795da26 (diff)
downloadhaskell-faa9d602e5a8afd2e4deeb0c7a79cb8959e12075.tar.gz
rts/Updates: Use proper atomic operations
-rw-r--r--rts/Updates.h12
1 files changed, 5 insertions, 7 deletions
diff --git a/rts/Updates.h b/rts/Updates.h
index 1bd3e065af..c5491ad8b2 100644
--- a/rts/Updates.h
+++ b/rts/Updates.h
@@ -76,19 +76,17 @@ INLINE_HEADER void updateWithIndirection (Capability *cap,
/* not necessarily true: ASSERT( !closure_IND(p1) ); */
/* occurs in RaiseAsync.c:raiseAsync() */
/* See Note [Heap memory barriers] in SMP.h */
- write_barrier();
- OVERWRITING_CLOSURE(p1);
- ((StgInd *)p1)->indirectee = p2;
- write_barrier();
- SET_INFO(p1, &stg_BLACKHOLE_info);
- LDV_RECORD_CREATE(p1);
- bd = Bdescr((StgPtr)p1);
+ bdescr *bd = Bdescr((StgPtr)p1);
if (bd->gen_no != 0) {
recordMutableCap(p1, cap, bd->gen_no);
TICK_UPD_OLD_IND();
} else {
TICK_UPD_NEW_IND();
}
+ OVERWRITING_CLOSURE(p1);
+ RELEASE_STORE(&((StgInd *)p1)->indirectee, p2);
+ SET_INFO_RELEASE(p1, &stg_BLACKHOLE_info);
+ LDV_RECORD_CREATE(p1);
}
#endif /* CMINUSMINUS */