diff options
author | Ben Gamari <ben@smart-cactus.org> | 2022-11-16 00:14:38 -0500 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2022-12-23 19:09:30 -0500 |
commit | d3fe110aaf7c40c5a4b2ff460abe33ee7fac6d93 (patch) | |
tree | 7e467c193b9faff0d0fdeef39a49338839cb8410 | |
parent | 0cd31f7d2c8baea0489770c765a7b8dd5c79679f (diff) | |
download | haskell-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.c | 4 |
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; |