diff options
author | GHC GitLab CI <ghc-ci@gitlab-haskell.org> | 2020-11-26 00:10:26 +0000 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2020-11-29 15:33:54 -0500 |
commit | 35a5207e8277800b77af90d74cdd235d29a901e6 (patch) | |
tree | 81493d76e96ff4e23f9afe2d68594b9e10c9c317 /rts/Messages.h | |
parent | e82cd140e510a792031247a8f414ade48382703b (diff) | |
download | haskell-35a5207e8277800b77af90d74cdd235d29a901e6.tar.gz |
rts/Messages: Add missing write barrier in THROWTO message update
After a THROWTO message has been handle the message closure is
overwritten by a NULL message. We must ensure that the original
closure's pointers continue to be visible to the nonmoving GC.
Diffstat (limited to 'rts/Messages.h')
-rw-r--r-- | rts/Messages.h | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/rts/Messages.h b/rts/Messages.h index 18371564c4..561eb449d2 100644 --- a/rts/Messages.h +++ b/rts/Messages.h @@ -23,8 +23,16 @@ void sendMessage (Capability *from_cap, Capability *to_cap, Message *msg); #include "SMPClosureOps.h" INLINE_HEADER void -doneWithMsgThrowTo (MessageThrowTo *m) +doneWithMsgThrowTo (Capability *cap, MessageThrowTo *m) { + // The message better be locked + ASSERT(m->header.info == &stg_WHITEHOLE_info); + IF_NONMOVING_WRITE_BARRIER_ENABLED { + updateRemembSetPushClosure(cap, (StgClosure *) m->link); + updateRemembSetPushClosure(cap, (StgClosure *) m->source); + updateRemembSetPushClosure(cap, (StgClosure *) m->target); + updateRemembSetPushClosure(cap, (StgClosure *) m->exception); + } OVERWRITING_CLOSURE((StgClosure*)m); unlockClosure((StgClosure*)m, &stg_MSG_NULL_info); LDV_RECORD_CREATE(m); |