diff options
author | Simon Marlow <marlowsd@gmail.com> | 2010-07-08 14:48:51 +0000 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2010-07-08 14:48:51 +0000 |
commit | ad3b79d22b32760f25bf10069bd2957462be959d (patch) | |
tree | 4ec55082b2fea66458d346e4c6540649d5e4c1f8 /rts/RaiseAsync.c | |
parent | cc94b30f3d854ed97ac6a7a54fa12247295219d4 (diff) | |
download | haskell-ad3b79d22b32760f25bf10069bd2957462be959d.tar.gz |
New asynchronous exception control API (ghc parts)
As discussed on the libraries/haskell-cafe mailing lists
http://www.haskell.org/pipermail/libraries/2010-April/013420.html
This is a replacement for block/unblock in the asychronous exceptions
API to fix a problem whereby a function could unblock asynchronous
exceptions even if called within a blocked context.
The new terminology is "mask" rather than "block" (to avoid confusion
due to overloaded meanings of the latter).
In GHC, we changed the names of some primops:
blockAsyncExceptions# -> maskAsyncExceptions#
unblockAsyncExceptions# -> unmaskAsyncExceptions#
asyncExceptionsBlocked# -> getMaskingState#
and added one new primop:
maskUninterruptible#
See the accompanying patch to libraries/base for the API changes.
Diffstat (limited to 'rts/RaiseAsync.c')
-rw-r--r-- | rts/RaiseAsync.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/rts/RaiseAsync.c b/rts/RaiseAsync.c index d8ab08ab13..ad830cf322 100644 --- a/rts/RaiseAsync.c +++ b/rts/RaiseAsync.c @@ -840,9 +840,7 @@ raiseAsync(Capability *cap, StgTSO *tso, StgClosure *exception, // top of the CATCH_FRAME ready to enter. // { -#ifdef PROFILING StgCatchFrame *cf = (StgCatchFrame *)frame; -#endif StgThunk *raise; if (exception == NULL) break; @@ -863,7 +861,12 @@ raiseAsync(Capability *cap, StgTSO *tso, StgClosure *exception, * a surprise exception before we get around to executing the * handler. */ - tso->flags |= TSO_BLOCKEX | TSO_INTERRUPTIBLE; + tso->flags |= TSO_BLOCKEX; + if ((cf->exceptions_blocked & TSO_INTERRUPTIBLE) == 0) { + tso->flags &= ~TSO_INTERRUPTIBLE; + } else { + tso->flags |= TSO_INTERRUPTIBLE; + } /* Put the newly-built THUNK on top of the stack, ready to execute * when the thread restarts. |