{-# LANGUAGE CPP, MagicHash, UnboxedTuples #-} module ConcurrentUtils ( -- * Variants of forkIO forkFinally ) where import Control.Concurrent.STM import Control.Exception import Control.Concurrent import Prelude hiding (catch) import Control.Monad import Control.Applicative import GHC.Exts import GHC.IO hiding (finally) import GHC.Conc #if __GLASGOW_HASKELL__ < 706 -- | fork a thread and call the supplied function when the thread is about -- to terminate, with an exception or a returned value. The function is -- called with asynchronous exceptions masked. forkFinally :: IO a -> (Either SomeException a -> IO ()) -> IO ThreadId forkFinally action and_then = mask $ \restore -> forkIO $ try (restore action) >>= and_then #endif