Well, hPipeFrom does indeed call forkProcess internally. I don't fully
understand when it is and is not safe to use 'forkProcess' with the
threaded runtime of GHC.

Which version of GHC are you using?

Antoine

On Sat, Jul 14, 2012 at 1:24 PM, Joey Hess <j...@kitenet.net> wrote:
> I've found a minimal test case that seems to demonstrate a bug in either
> MissingH or ghc's threaded runtime. Or I'm doing something stupid in
> fewer lines of code than usual. ;)
>
> When built with the threaded runtime, after a short while it hangs in
> hGetContents.
>
> import System.Cmd
> import System.IO
> import System.Cmd.Utils
> import System.Posix.Process
> import Control.Monad
>
> main :: IO ()
> main = forever $ pipeRead ["hello", "world"]
>
> pipeRead :: [String] -> IO ()
> pipeRead params = do
>         -- removing this next line avoids the hang somehow
>         print $ "pipeRead in " ++ show params
>         (p, h) <- hPipeFrom "echo" params
>         print "pipeRead getcontents"
>         c <- hGetContents h
>         print $ "got: " ++ c
>         _ <- getProcessStatus True False $ processID p
>         -- removing this last line avoids the hang somehow
>         print "pipeRead out"
>
> joey@wren:~>ghc --make -threaded test
> [1 of 1] Compiling Main             ( test.hs, test.o )
> Linking test ...
> joey@wren:~>./test
> "pipeRead in [\"hello\",\"world\"]"
> "pipeRead getcontents"
> "got: hello world\n"
> "pipeRead out"
> "pipeRead in [\"hello\",\"world\"]"
> "pipeRead getcontents"
> "got: hello world\n"
> "pipeRead out"
> <snip 20 repeats>
> "pipeRead in [\"hello\",\"world\"]"
> "pipeRead getcontents"
> <hang>
>
> Ghc 7.4.2, Debian Linux
>
> --
> see shy jo
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to