From 8b470bf8628a25675b987fd37832bac0bf9b2688 Mon Sep 17 00:00:00 2001
From: Ian Lynagh <ian@well-typed.com>
Date: Sat, 27 Apr 2013 19:44:59 +0100
Subject: [PATCH 1/2] Factor out a helper function

---
 System/Process.hs |   29 ++++++++++++++++-------------
 1 file changed, 16 insertions(+), 13 deletions(-)

diff --git a/System/Process.hs b/System/Process.hs
index 42d2fac..96c621d 100644
--- a/System/Process.hs
+++ b/System/Process.hs
@@ -349,13 +349,7 @@ waitForProcess ph = do
           modifyProcessHandle ph $ \p_' ->
             case p_' of
               ClosedHandle e -> return (p_',e)
-              OpenHandle ph' -> do
-                closePHANDLE ph'
-                code <- peek pret
-                let e = if (code == 0)
-                       then ExitSuccess
-                       else (ExitFailure (fromIntegral code))
-                return (ClosedHandle e, e)
+              OpenHandle ph' -> resolveProcessHandle pret ph'
 
 -- -----------------------------------------------------------------------------
 --
@@ -671,14 +665,23 @@ getProcessExitCode ph = do
         alloca $ \pExitCode -> do
             res <- throwErrnoIfMinus1Retry "getProcessExitCode" $
                         c_getProcessExitCode h pExitCode
-            code <- peek pExitCode
             if res == 0
               then return (p_, Nothing)
-              else do
-                   closePHANDLE h
-                   let e  | code == 0 = ExitSuccess
-                          | otherwise = ExitFailure (fromIntegral code)
-                   return (ClosedHandle e, Just e)
+              else do (p_', ec) <- resolveProcessHandle pExitCode h
+                      return (p_', Just ec)
+
+-- ----------------------------------------------------------------------------
+-- Helper
+
+resolveProcessHandle :: Ptr CInt -> PHANDLE
+                     -> IO (ProcessHandle__, ExitCode)
+resolveProcessHandle pExitCode ph
+    = do closePHANDLE ph
+         code <- peek pExitCode
+         let e = if code == 0
+                 then ExitSuccess
+                 else ExitFailure (fromIntegral code)
+         return (ClosedHandle e, e)
 
 -- ----------------------------------------------------------------------------
 -- Interface to C bits
-- 
1.7.10.4

