summaryrefslogtreecommitdiff
path: root/src/System/Process/Concurrent.hs
blob: 0e00e4fd860ed18ef8037fa37548635c1e9b0758 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-- | 
-- Copyright: 2015 Joey Hess <id@joeyh.name>
-- License: BSD-2-clause
-- 
-- The functions exported by this module are intended to be drop-in
-- replacements for those from System.Process, when converting a whole
-- program to use System.Console.Concurrent.

module System.Process.Concurrent where

import System.Console.Concurrent
import System.Console.Concurrent.Internal (ConcurrentProcessHandle(..))
import System.Process hiding (createProcess, waitForProcess)
import System.IO
import System.Exit

-- | Calls `createProcessConcurrent`
--
-- You should use the waitForProcess in this module on the resulting
-- ProcessHandle. Using System.Process.waitForProcess instead can have
-- mildly unexpected results.
createProcess :: CreateProcess -> IO (Maybe Handle, Maybe Handle, Maybe Handle, ProcessHandle)
createProcess p = do
	(i, o, e, ConcurrentProcessHandle h) <- createProcessConcurrent p
	return (i, o, e, h)

-- | Calls `waitForProcessConcurrent`
--
-- You should only use this on a ProcessHandle obtained by calling
-- createProcess from this module. Using this with a ProcessHandle
-- obtained from System.Process.createProcess etc will have extremely
-- unexpected results; it can wait a very long time before returning.
waitForProcess :: ProcessHandle -> IO ExitCode
waitForProcess = waitForProcessConcurrent . ConcurrentProcessHandle