From b29b736b406be134e783b8322cb09a6433acf108 Mon Sep 17 00:00:00 2001 From: stolz Date: Fri, 28 Feb 2003 12:34:43 +0000 Subject: [PATCH] [project @ 2003-02-28 12:34:43 by stolz] - Rename System.Posix.Process.forkProcess to forkProcessAll - Move GHC.Conc.forkProcess to System.Posix with type 'Maybe ProcessID' Prompted by: George Russel --- GHC/Conc.lhs | 34 +++++++++------------------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/GHC/Conc.lhs b/GHC/Conc.lhs index cf15836..9707ad0 100644 --- a/GHC/Conc.lhs +++ b/GHC/Conc.lhs @@ -27,7 +27,6 @@ module GHC.Conc , yield -- :: IO () , labelThread -- :: ThreadId -> String -> IO () , forkProcessPrim -- :: IO Int - , forkProcess -- :: IO (Maybe Int) -- Waiting , threadDelay -- :: Int -> IO () @@ -59,6 +58,7 @@ import Data.Maybe import GHC.Base import GHC.IOBase ( IO(..), MVar(..), ioException, IOException(..), IOErrorType(..) ) import GHC.Num ( fromInteger, negate ) +import GHC.Real ( fromIntegral ) import GHC.Base ( Int(..) ) import GHC.Exception ( Exception(..), AsyncException(..) ) import GHC.Pack ( packCString# ) @@ -150,10 +150,12 @@ labelThread (ThreadId t) str = IO $ \ s -> adr = byteArrayContents# ps in case (labelThread# t adr s) of s1 -> (# s1, () #) -{- | This function is a replacement for "Posix.forkProcess": This implementation -/will stop all other Concurrent Haskell threads/ in the (heavyweight) forked copy. -'forkProcessPrim' returns the pid of the child process to the parent, 0 to the child, -and a value less than 0 in case of errors. See also: 'forkProcess'. +{- | This function is a replacement for "System.Posix.Process.forkProcessAll": +This implementation /will stop all other Concurrent Haskell threads/ in the +(heavyweight) forked copy. +'forkProcessPrim' returns the pid of the child process to the parent, 0 to the +child, and a value less than 0 in case of errors. See also: +'System.Posix.Process.forkProcess' in package @unix@. Without this function, you need excessive and often impractical explicit synchronization using the regular Concurrent Haskell constructs to assure @@ -166,29 +168,11 @@ NOTE: currently, main threads are not stopped in the child process. To work around this problem, call 'forkProcessPrim' from the main thread. -} +-- XXX RTS should know about 'pid_t'. + forkProcessPrim :: IO Int forkProcessPrim = IO $ \s -> case (forkProcess# s) of (# s1, id #) -> (# s1, (I# id) #) -{- | 'forkProcess' is a wrapper around 'forkProcessPrim' similar to the one found in -"Posix.forkProcess" which returns a Maybe-type. The child receives @Nothing@, the -parent @Just (pid::Int)@. In case of an error, an exception is thrown. - -NOTE: currently, main threads are not stopped in the child process. -To work around this problem, call 'forkProcess' from the main thread. --} - -forkProcess :: IO (Maybe Int) -forkProcess = do - pid <- forkProcessPrim - case pid of - -1 -> ioException (IOError Nothing -- stolen from hslibs/posix/PosixUtil - SystemError - "forkProcess" - "" - Nothing) - 0 -> return Nothing - _ -> return (Just pid) - -- Nota Bene: 'pseq' used to be 'seq' -- but 'seq' is now defined in PrelGHC -- -- 1.7.10.4