summaryrefslogtreecommitdiff
path: root/rts/Messages.h
diff options
context:
space:
mode:
authorGHC GitLab CI <ghc-ci@gitlab-haskell.org>2020-11-26 00:10:26 +0000
committerMarge Bot <ben+marge-bot@smart-cactus.org>2020-11-29 15:33:54 -0500
commit35a5207e8277800b77af90d74cdd235d29a901e6 (patch)
tree81493d76e96ff4e23f9afe2d68594b9e10c9c317 /rts/Messages.h
parente82cd140e510a792031247a8f414ade48382703b (diff)
downloadhaskell-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.h10
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);