
Ticket: http://hackage.haskell.org/trac/ghc/ticket/4858 We added forkIOUnmasked as part of the new asynchronous exceptions API in base 4.3.0.0 (GHC 7.0.1). Unfortunately, forkIOUnmasked isn't very useful: the computation in the child thread is executed in the unmasked state, so the child doesn't have a way to reliably set up an exception handler before an asynchronous exception is raised. This proposal is to replace forkIOUnmasked with forkIOWithUnmask: -- | Like 'forkIO', but the child thread is passed a function that can -- be used to unmask asynchronous exceptions. This function is -- typically used in the following way -- -- > ... mask_ $ forkIOWithUnmask $ \unmask -> -- > catch (unmask ...) handler -- -- so that the exception handler in the child thread is established -- with asynchronous exceptions masked, meanwhile the main body of -- the child thread is executed in the unmasked state. -- -- Note that the unmask function passed to the child thread should -- only be used in that thread; the behaviour is undefined if it is -- invoked in a different thread. -- forkIOWithUnmask :: ((forall a . IO a -> IO a) -> IO ()) -> IO ThreadId forkIOWithUnmask io = forkIO (io unsafeUnmask) forkIOUnmasked will be deprecated. Above is almost the entire implementation, hence I didn't bother attaching a patch to the ticket. Some discussion leading up to this can be found in http://hackage.haskell.org/trac/ghc/ticket/3837. Discussion period: 3 weeks (until 12 Jan 2011) Cheers, Simon