summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2022-11-16 00:14:38 -0500
committerMarge Bot <ben+marge-bot@smart-cactus.org>2022-12-23 19:09:30 -0500
commitd3fe110aaf7c40c5a4b2ff460abe33ee7fac6d93 (patch)
tree7e467c193b9faff0d0fdeef39a49338839cb8410
parent0cd31f7d2c8baea0489770c765a7b8dd5c79679f (diff)
downloadhaskell-d3fe110aaf7c40c5a4b2ff460abe33ee7fac6d93.tar.gz
nonmoving: Fix benign race in update remembered set check
Relaxed load is fine here since we will take the lock before looking at the list.
-rw-r--r--rts/sm/NonMovingMark.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/rts/sm/NonMovingMark.c b/rts/sm/NonMovingMark.c
index a0a86cdc07..a6ce3678bc 100644
--- a/rts/sm/NonMovingMark.c
+++ b/rts/sm/NonMovingMark.c
@@ -1774,7 +1774,9 @@ nonmovingMark (MarkQueue *queue)
}
case NULL_ENTRY:
// Perhaps the update remembered set has more to mark...
- if (upd_rem_set_block_list) {
+ // N.B. This must be atomic since we have not yet taken
+ // upd_rem_set_lock.
+ if (RELAXED_LOAD(&upd_rem_set_block_list) != NULL) {
ACQUIRE_LOCK(&upd_rem_set_lock);
bdescr *old = queue->blocks;
queue->blocks = upd_rem_set_block_list;