diff options
author | Simon Marlow <marlowsd@gmail.com> | 2012-06-05 09:05:47 +0100 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2012-06-07 16:59:01 +0100 |
commit | 20ba7f1a7a7b05acd81124f1567a3a103bcd0d1b (patch) | |
tree | 599e43542bf0f0ced2c0f91fbe43cda664667320 /rts/RaiseAsync.c | |
parent | fe0ae8d546ec91dab29d1456db269d9e7b010971 (diff) | |
download | haskell-20ba7f1a7a7b05acd81124f1567a3a103bcd0d1b.tar.gz |
throwTo: unlock the MSG_THROWTO object before returning (#6103)
Diffstat (limited to 'rts/RaiseAsync.c')
-rw-r--r-- | rts/RaiseAsync.c | 10 |
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; } } |