add forkFinally
authorSimon Marlow <marlowsd@gmail.com>
Thu, 7 Jun 2012 15:10:47 +0000 (16:10 +0100)
committerSimon Marlow <marlowsd@gmail.com>
Thu, 7 Jun 2012 16:04:42 +0000 (17:04 +0100)
commit40d1be115d2a5a409e9b747c347cd909a9607c42
treedfdc8a81b98d603e3377d7216dd83d902490d7d1
parent6172212097337923b621be9e12b3542c34cad10e
add forkFinally

This is a more robust version of "forkIO (m `finally` k)", because it
closes a window between thread creation and the finally where the
thread can receive an async exception.  Useful for layers over threads
that need to catch threads dying with absolute certainty.

forkFinally :: IO a -> (Either SomeException a -> IO ()) -> IO ThreadId
forkFinally action and_then =
  mask $ \restore ->
    forkIO $ try (restore action) >>= and_then
Control/Concurrent.hs