diff options
Diffstat (limited to 'rts/RaiseAsync.c')
-rw-r--r-- | rts/RaiseAsync.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/rts/RaiseAsync.c b/rts/RaiseAsync.c index 39f39a22b4..a0719024b4 100644 --- a/rts/RaiseAsync.c +++ b/rts/RaiseAsync.c @@ -175,7 +175,7 @@ throwToSelf (Capability *cap, StgTSO *tso, StgClosure *exception) - or it is masking exceptions (TSO_BLOCKEX) Currently, if the target is BlockedOnMVar, BlockedOnSTM, - or BlockedOnBlackHole then we acquire ownership of the + BlockedOnIOCompletion or BlockedOnBlackHole then we acquire ownership of the TSO by locking its parent container (e.g. the MVar) and then raise the exception. We might change these cases to be more message-passing-like in the future. @@ -344,6 +344,7 @@ check_target: case BlockedOnMVar: case BlockedOnMVarRead: + case BlockedOnIOCompletion: { /* To establish ownership of this TSO, we need to acquire a @@ -369,7 +370,8 @@ check_target: // we have the MVar, let's check whether the thread // is still blocked on the same MVar. if ((target->why_blocked != BlockedOnMVar - && target->why_blocked != BlockedOnMVarRead) + && target->why_blocked != BlockedOnMVarRead + && target->why_blocked != BlockedOnIOCompletion) || (StgMVar *)target->block_info.closure != mvar) { unlockClosure((StgClosure *)mvar, info); goto retry; @@ -682,6 +684,7 @@ removeFromQueues(Capability *cap, StgTSO *tso) case BlockedOnMVar: case BlockedOnMVarRead: + case BlockedOnIOCompletion: removeFromMVarBlockedQueue(tso); goto done; |