diff options
author | Ben Gamari <ben@smart-cactus.org> | 2022-11-16 00:14:38 -0500 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2022-12-21 15:46:41 -0500 |
commit | 7570ae43218fbdee30f783af5a3f49fa3d8301e3 (patch) | |
tree | 49ea2ce0125f85a8a9cf21eee2eab90a2bfbdf2b | |
parent | 2d10d8dfdff1212286490c2c19b8f725ce501b10 (diff) | |
download | haskell-7570ae43218fbdee30f783af5a3f49fa3d8301e3.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; |