diff options
author | Ben Gamari <ben@smart-cactus.org> | 2019-03-03 00:16:00 -0500 |
---|---|---|
committer | Ben Gamari <ben@well-typed.com> | 2019-03-04 10:18:41 -0500 |
commit | e7080bef906b66d0e7053db99c9733aa95059d42 (patch) | |
tree | ecd7137e99df8117bc6318a89cd46f63570524e6 /compiler/utils | |
parent | 22c2713bcc30cea9da7d8b95f3ea99357d1551f7 (diff) | |
download | haskell-e7080bef906b66d0e7053db99c9733aa95059d42.tar.gz |
Revert "compiler: Refactor: extract `withAtomicRename`"
This reverts commit e8a08f400744a860d1366c6680c8419d30f7cc2a.
Diffstat (limited to 'compiler/utils')
-rw-r--r-- | compiler/utils/Util.hs | 24 |
1 files changed, 1 insertions, 23 deletions
diff --git a/compiler/utils/Util.hs b/compiler/utils/Util.hs index 41f63f2246..16864fe017 100644 --- a/compiler/utils/Util.hs +++ b/compiler/utils/Util.hs @@ -99,7 +99,6 @@ module Util ( doesDirNameExist, getModificationUTCTime, modificationTimeIfExists, - withAtomicRename, global, consIORef, globalM, sharedGlobal, sharedGlobalM, @@ -146,10 +145,9 @@ import GHC.Stack (HasCallStack) import Control.Applicative ( liftA2 ) import Control.Monad ( liftM, guard ) -import Control.Monad.IO.Class ( MonadIO, liftIO ) import GHC.Conc.Sync ( sharedCAF ) import System.IO.Error as IO ( isDoesNotExistError ) -import System.Directory ( doesDirectoryExist, getModificationTime, renameFile ) +import System.Directory ( doesDirectoryExist, getModificationTime ) import System.FilePath import Data.Char ( isUpper, isAlphaNum, isSpace, chr, ord, isDigit, toUpper @@ -1306,26 +1304,6 @@ modificationTimeIfExists f = do else ioError e -- -------------------------------------------------------------- --- atomic file writing by writing to a temporary file first (see #14533) --- --- This should be used in all cases where GHC writes files to disk --- and uses their modification time to skip work later, --- as otherwise a partially written file (e.g. due to crash or Ctrl+C) --- also results in a skip. - -withAtomicRename :: (MonadIO m) => FilePath -> (FilePath -> m a) -> m a -withAtomicRename targetFile f = do - -- The temp file must be on the same file system (mount) as the target file - -- to result in an atomic move on most platforms. - -- The standard way to ensure that is to place it into the same directory. - -- This can still be fooled when somebody mounts a different file system - -- at just the right time, but that is not a case we aim to cover here. - let temp = targetFile <.> "tmp" - res <- f temp - liftIO $ renameFile temp targetFile - return res - --- -------------------------------------------------------------- -- split a string at the last character where 'pred' is True, -- returning a pair of strings. The first component holds the string -- up (but not including) the last character for which 'pred' returned |