summaryrefslogtreecommitdiff
path: root/rts/RaiseAsync.c
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2012-06-05 09:05:47 +0100
committerSimon Marlow <marlowsd@gmail.com>2012-06-07 16:59:01 +0100
commit20ba7f1a7a7b05acd81124f1567a3a103bcd0d1b (patch)
tree599e43542bf0f0ced2c0f91fbe43cda664667320 /rts/RaiseAsync.c
parentfe0ae8d546ec91dab29d1456db269d9e7b010971 (diff)
downloadhaskell-20ba7f1a7a7b05acd81124f1567a3a103bcd0d1b.tar.gz
throwTo: unlock the MSG_THROWTO object before returning (#6103)
Diffstat (limited to 'rts/RaiseAsync.c')
-rw-r--r--rts/RaiseAsync.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/rts/RaiseAsync.c b/rts/RaiseAsync.c
index c14b4112bd..9e5a8c3b2f 100644
--- a/rts/RaiseAsync.c
+++ b/rts/RaiseAsync.c
@@ -156,8 +156,7 @@ throwTo (Capability *cap, // the Capability we hold
MessageThrowTo *msg;
msg = (MessageThrowTo *) allocate(cap, sizeofW(MessageThrowTo));
- // message starts locked; the caller has to unlock it when it is
- // ready.
+ // the message starts locked; see below
SET_HDR(msg, &stg_WHITEHOLE_info, CCS_SYSTEM);
msg->source = source;
msg->target = target;
@@ -166,9 +165,16 @@ throwTo (Capability *cap, // the Capability we hold
switch (throwToMsg(cap, msg))
{
case THROWTO_SUCCESS:
+ // unlock the message now, otherwise we leave a WHITEHOLE in
+ // the heap (#6103)
+ SET_HDR(msg, &stg_MSG_THROWTO_info, CCS_SYSTEM);
return NULL;
+
case THROWTO_BLOCKED:
default:
+ // the caller will unlock the message when it is ready. We
+ // cannot unlock it yet, because the calling thread will need
+ // to tidy up its state first.
return msg;
}
}