-- | The TempFile module allocates temporary files module Util.TempFile( newTempFile, -- :: IO FilePath ) where import System.Directory import Control.Concurrent import System.IO.Unsafe import Util.IOExtras import Util.WBFiles import Util.UniqueFile import Util.FileNames data TempFileSource = TempFileSource { fileStore :: UniqueFileStore, fileSource :: MVar UniqueFileCounter } tempFileSource :: TempFileSource tempFileSource = unsafePerformIO ( do workingDir <- getWorkingDir let directory = combineNames workingDir "#" catchAlreadyExists (createDirectory workingDir) catchAlreadyExists (createDirectory directory) fileStore <- newUniqueFileStore directory createDirectory fileSource <- newMVar initialUniqueFileCounter return (TempFileSource {fileStore = fileStore,fileSource = fileSource}) ) {-# NOINLINE tempFileSource #-} newTempFile :: IO FilePath newTempFile = do let TempFileSource {fileStore = fileStore,fileSource = fileSource} = tempFileSource fileCounter <- takeMVar fileSource let (newName,nextFileCounter) = stepUniqueFileCounter fileCounter putMVar fileSource nextFileCounter ensureDirectories fileStore newName return (getFilePath fileStore newName)