Hello Haskellers,
Having been pretty much impressed by Don Stewart's "Practical Haskell"
(http://donsbot.wordpress.com/2010/08/17/practical-haskell/), I
started to write a Haskell script to run maven jobs (yes, I know...).
In the course of undertaking this fantastic endeavour, I started to
use the System.Process.readProcessWithExitCode function, but following
the advice in the comment for this function, I rolled my own stuff and
ended up writing the following:

> doRunMvnInIO pom args filters e
>  = do (Just inh, Just outh, Just errh, pid) <-
>         createProcess (proc (maven e)  (["-f", pom] ++ args)) { std_in  = 
>CreatePipe,
>                                                                 std_out = 
>CreatePipe,
>                                                                 std_err = 
>CreatePipe }
>       waitQ <- newEmptyMVar
>
>       mapM (printAndWait waitQ)  [outh, errh]
>
>       hClose inh
>       -- wait on the process
>       waitForProcess pid
>         where
>           printAndWait waitQ hdl = do out <- hGetContents hdl
>                                       forkIO (mapM (putStrLn) (filter filters 
>$ lines out) >> putMVar waitQ ())
>                                       takeMVar waitQ
>                                       hClose hdl

This is actually a rewrite of the following function:

> doRunMvnInIO' pom args filters e
>  = do (Just inh, Just outh, Just errh, pid) <-
>         createProcess (proc (maven e)  (["-f", pom] ++ args)) { std_in  = 
> CreatePipe,
>                                                                 std_out = 
> CreatePipe,
>                                                                 std_err = 
> CreatePipe }
>       waitQ <- newEmptyMVar
>
>       mapM (printAndWait waitQ)  [outh, errh] >>= mapM (\_ -> takeMVar waitQ)
>
>       hClose inh
>       hClose outh
>       hClose errh
>       -- wait on the process
>       waitForProcess pid
>         where
>           printAndWait waitQ hdl = do out <- hGetContents hdl
>                                       forkIO (mapM (putStrLn) (filter filters 
> $ lines out) >> putMVar waitQ ())

What surprised me is that I would expect the behaviour of the two
functions to be different:
 - in doRunMvnInIO, I would expect stdout's content to be printed
before stderr, ie. the 2 threads are ordered because I call takeMVar
in between calls to forkIO
 - in doRunMvnInIO', this is not true and both theads run concurrently.

but actually there does not seem to be a difference: printing is still
interleaved in both functions, AFAICT.

I would welcome any help on this.
Best regards,
Arnaud
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to