uni-reactor-2.2.0.0: Reactor/WithDir.hs
-- | A function for changing directories in a thread-safe way.
--
-- We use an MSem to lock the current directory. This means that
-- withDir can be nested without deadlock (presumably the user knows what
-- he's doing).
module Reactor.WithDir(
withDir, -- :: FilePath -> IO a -> IO a
) where
import System.Directory
import System.IO.Unsafe
import Util.Computation
import Events.Synchronized
import Reactor.MSem
dirMSem :: MSem
dirMSem = unsafePerformIO newMSem
{-# NOINLINE dirMSem #-}
withDir :: FilePath -> IO a -> IO a
withDir filePath act =
synchronize dirMSem (
do
originalDir <- getCurrentDirectory
setCurrentDirectory filePath
actOut <- try act
setCurrentDirectory originalDir
propagate actOut
)