[Haskell-cafe] Asynchronous exception wormholes kill modularity
Bas van Dijk
v.dijk.bas at gmail.com
Fri Mar 26 11:37:01 EDT 2010
On Fri, Mar 26, 2010 at 3:43 PM, Gregory Collins
<greg at gregorycollins.net> wrote:
> Matthew Brecknell <matthew at brecknell.net> writes:
>
>> And is confirmed by a simple test (with GHC 6.10.4 on Linux):
>>
>> import Prelude hiding(catch)
>> import Control.Concurrent
>> import Control.Exception
>>
>> main = do
>> chan <- newEmptyMVar
>> done <- newEmptyMVar
>> kill <- block $ forkIO $ do
>> (takeMVar chan >>= putMVar done)
>> `onException` putMVar done "Exception received during takeMVar"
>> ...
>
> Should this be "forkIO $ block" instead of "block $ forkIO"?
No.
First of all note that forked threads inherit the blocked state of
their parents:
http://haskell.org/ghc/docs/latest/html/libraries/base-4.2.0.0/Control-Exception.html#v:block
The reason Matthew first blocks then calls forkIO is that he needs to
install an exception handler for the forked thread:
`onException` putMVar done "Exception received during takeMVar"
If he does not call block or only later calls it in the forked thread
a chance exists that an asynchronous exception is thrown to the forked
thread before the exception handler is installed.
regards,
Bas
More information about the Haskell-Cafe
mailing list