diff options
author | Simon Marlow <simonmar@microsoft.com> | 2007-01-05 13:57:15 +0000 |
---|---|---|
committer | Simon Marlow <simonmar@microsoft.com> | 2007-01-05 13:57:15 +0000 |
commit | 178837a730c65349b32b29bd22356bacde110e18 (patch) | |
tree | 667c1969ec29fc21d02b7506087be1b1ff092417 /rts/RaiseAsync.c | |
parent | 7afd995197924dc6d650b51e160755d651ad1e0d (diff) | |
download | haskell-178837a730c65349b32b29bd22356bacde110e18.tar.gz |
Eagerly raise a blocked exception when entering 'unblock' or exiting 'block'
This fixes #1047
Diffstat (limited to 'rts/RaiseAsync.c')
-rw-r--r-- | rts/RaiseAsync.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/rts/RaiseAsync.c b/rts/RaiseAsync.c index d55595309b..d892e95638 100644 --- a/rts/RaiseAsync.c +++ b/rts/RaiseAsync.c @@ -496,9 +496,11 @@ throwToReleaseTarget (void *tso) queue, but not perform any throwTo() immediately. This might be more appropriate when the target thread is the one actually running (see Exception.cmm). + + Returns: non-zero if an exception was raised, zero otherwise. -------------------------------------------------------------------------- */ -void +int maybePerformBlockedException (Capability *cap, StgTSO *tso) { StgTSO *source; @@ -514,7 +516,7 @@ maybePerformBlockedException (Capability *cap, StgTSO *tso) // locked it. if (tso->blocked_exceptions == END_TSO_QUEUE) { unlockTSO(tso); - return; + return 0; } // We unblock just the first thread on the queue, and perform @@ -524,7 +526,9 @@ maybePerformBlockedException (Capability *cap, StgTSO *tso) tso->blocked_exceptions = unblockOne_(cap, source, rtsFalse/*no migrate*/); unlockTSO(tso); + return 1; } + return 0; } void |