diff options
| author | Josh Rahm <joshuarahm@gmail.com> | 2025-12-08 00:36:48 -0700 |
|---|---|---|
| committer | Josh Rahm <joshuarahm@gmail.com> | 2025-12-08 00:36:48 -0700 |
| commit | 37a239308d247bc9debb226bbe5b7ab8d7fd954e (patch) | |
| tree | 8de57bcb7fce48c0d1380ddee7d3433132d1b2c3 /src/Language/Fiddle/Compiler | |
| parent | 2ccfffec265fdf33c04c252e1f9006b36591ce94 (diff) | |
| download | fiddle-main.tar.gz fiddle-main.tar.bz2 fiddle-main.zip | |
[bugfix] - fix missing interface file race condition.main
Diffstat (limited to 'src/Language/Fiddle/Compiler')
| -rw-r--r-- | src/Language/Fiddle/Compiler/ImportResolution.hs | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/Language/Fiddle/Compiler/ImportResolution.hs b/src/Language/Fiddle/Compiler/ImportResolution.hs index 5c09523..296b540 100644 --- a/src/Language/Fiddle/Compiler/ImportResolution.hs +++ b/src/Language/Fiddle/Compiler/ImportResolution.hs @@ -10,9 +10,10 @@ where import qualified Codec.Compression.GZip as GZip import Control.Arrow (Arrow (second)) +import Control.Exception (uninterruptibleMask) import Control.Monad (filterM, when) -import Control.Monad.State (put) import Control.Monad.Loops (untilM_) +import Control.Monad.State (put) import Control.Monad.Trans.Maybe (MaybeT (MaybeT, runMaybeT)) import Control.Monad.Writer.Lazy (MonadTrans (lift), MonadWriter (tell), WriterT (..), execWriterT) import Data.Aeson (eitherDecode, encode) @@ -31,8 +32,8 @@ import Language.Fiddle.Types import Options.Applicative import System.Directory import System.FilePath +import System.IO.Error (catchIOError) import Text.Printf (printf) -import Control.Exception (uninterruptibleMask) data Flags = Flags { importDirectories :: [FilePath], @@ -278,7 +279,12 @@ getImportResolutionState parseFile compileToChecked flags unit = do untilM_ (return ()) (doesFileExist intfile) else do BL.writeFile tmpIntFile $ GZip.compress (encode val) - renameFile tmpIntFile intfile + + -- Might get a "file does not exist", means another process already + -- moved it. + catchIOError + (renameFile tmpIntFile intfile) + (\(e :: IOError) -> return ()) interfaceFileValid :: FilePath -> FilePath -> IO Bool interfaceFileValid originalPath intfPath = do |