[Git][ghc/ghc][wip/T18069] SysTools.Process: Handle exceptions in readCreateProcessWithExitCode'

Ben Gamari gitlab at gitlab.haskell.org
Tue May 19 17:11:08 UTC 2020



Ben Gamari pushed to branch wip/T18069 at Glasgow Haskell Compiler / GHC


Commits:
c35a78a2 by Ben Gamari at 2020-05-19T13:08:43-04:00
SysTools.Process: Handle exceptions in readCreateProcessWithExitCode'

In #18069 we are observing MVar deadlocks from somewhere in ghc.exe.
This use of MVar stood out as being one of the more likely culprits.
Here we make sure that it is exception-safe.

- - - - -


1 changed file:

- compiler/GHC/SysTools/Process.hs


Changes:

=====================================
compiler/GHC/SysTools/Process.hs
=====================================
@@ -41,6 +41,15 @@ enableProcessJobs opts = opts { use_process_jobs = True }
 enableProcessJobs opts = opts
 #endif
 
+#if !MIN_VERSION_base(4,15,0)
+-- TODO: This can be dropped with GHC 8.16
+hGetContents' :: Handle -> IO String
+hGetContents' hdl = do
+  output  <- hGetContents hdl
+  evaluate $ length output
+  return output
+#endif
+
 -- Similar to System.Process.readCreateProcessWithExitCode, but stderr is
 -- inherited from the parent process, and output to stderr is not captured.
 readCreateProcessWithExitCode'
@@ -51,13 +60,18 @@ readCreateProcessWithExitCode' proc = do
         createProcess proc{ std_out = CreatePipe }
 
     -- fork off a thread to start consuming the output
-    output  <- hGetContents outh
     outMVar <- newEmptyMVar
-    _ <- forkIO $ evaluate (length output) >> putMVar outMVar ()
+    let onError exc = takeMVar outMVar (Left exc)
+    _ <- forkIO $ handleAll onError $ do
+      output <- hGetContents' outh
+      putMVar outMVar $ Right output
 
     -- wait on the output
-    takeMVar outMVar
+    result <- takeMVar outMVar
     hClose outh
+    output <- case result of
+      Left exc -> throwIO exc
+      Right output -> return output
 
     -- wait on the process
     ex <- waitForProcess pid



View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/c35a78a2429444b601774b73f53de5f08a675a7c

-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/c35a78a2429444b601774b73f53de5f08a675a7c
You're receiving this email because of your account on gitlab.haskell.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20200519/1f83e398/attachment-0001.html>


More information about the ghc-commits mailing list