Proposal: Add Control.Concurrent.forkIOWithUnmask, deprecate forkIOUnmasked

Simon Marlow marlowsd at
Wed Dec 22 11:50:32 CET 2010


We added forkIOUnmasked as part of the new asynchronous exceptions API 
in base (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

Discussion period: 3 weeks (until 12 Jan 2011)


More information about the Libraries mailing list