System.IO.openTempFile is not thread safe on Windows
Given the test program:
import Control.Concurrent
import System.IO
import Control.Monad
import System.Directory
main = do
putStrLn "Starting"
var <- newEmptyMVar
tdir <- getTemporaryDirectory
xs <- replicateM 10 $ do
var <- newEmptyMVar
flip forkFinally (\s -> do print s; putMVar var ()) $ do
replicateM_ 100000 $ do
(file, h) <- openTempFile tdir "test.txt"
hClose h
removeFile file
return var
mapM_ takeMVar xs
If I compile and run that with ghc --make TmpFile.hs -threaded && tmpfile +RTS -N5
I get:
Starting
Left C:\Users\NDMIT_~1\AppData\Local\Temp\: openTempFile: permission denied (Permission denied)
Left C:\Users\NDMIT_~1\AppData\Local\Temp\: openTempFile: permission denied (Permission denied)
...
I've reproduced this on GHC 7.8 and 7.10.1. We hit this in production about twice a day.
Trac metadata
Trac field | Value |
---|---|
Version | 7.10.1 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | libraries/base |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | ndmitchell@gmail.com |
Operating system | |
Architecture |