Ticket #4858 (closed proposal: invalid)
Add Control.Concurrent.forkIOWithUnmask, deprecate forkIOUnmasked
|Reported by:||simonmar||Owned by:|
|Type of failure:||None/Unknown||Difficulty:|
|Test Case:||Blocked By:|
Description (last modified by simonmar) (diff)
We added forkIOUnmasked as part of the new asynchronous exceptions API in base 184.108.40.206 (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.
Some discussion leading up to this can be found in #4810.
Discussion period: 3 weeks (until 12 Jan 2011)