id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	os	architecture	failure	difficulty	testcase	blockedby	blocking	related
4858	Add Control.Concurrent.forkIOWithUnmask, deprecate forkIOUnmasked	simonmar		"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.

Some discussion leading up to this can be found in #4810.

Discussion period: 3 weeks (until 12 Jan 2011)
"	proposal	closed	normal	Not GHC	libraries/base	7.0.1	invalid		mmitar@…	Unknown/Multiple	Unknown/Multiple	None/Unknown					
