IO concurrency

Max A . K . max630@mail.ru
Wed, 10 Oct 2001 11:01:23 +0700


Hello.

Playing with GHC, I met some oddity.
Consider the example:

> import IO
> import Concurrent
> import Posix
> import PosixIO
> 
> main = do
>     (fdIn, fdIn_send) <- createPipe
>     hIn_send <- fdToHandle fdIn_send
>     hIn <- fdToHandle fdIn
>	    -- The "waiter" is a simple tk/tcl script which
>	    -- prints "click" anytime I click a button.
>     runProcess "./waiter" [] Nothing Nothing
> 		Nothing (Just hIn_send) Nothing
>     -- hSetBuffering hIn LineBuffering {-2-}
>     -- hSetBuffering stdin LineBuffering
>     forkIO(interact stdin)
>     -- forkIO(interact hIn) {-1-}
>     main_cycle
>     where
> 	interact hIn = do
> 	    line <- hGetLine hIn
>	    numIn <- handleToInt {-made from handleToFd & fdToInt-}
>	    -- threadWaitRead numIn {-3-}
> 	    putStrLn line
> 	    interact hIn
> 	main_cycle = do
> 	    putStrLn "tick"
> 	    threadDelay 1000000
> 	    main_cycle


The example works OK. It prints "tick" once a second and dups my input
as I type it. But, when I uncomment the line {-1-} to handle input from
child as well, everything is hanged on this read operation. Uncommenting
the {-3-} line helps, but, first, I'm not sure it is a right way and,
second, the matter is still unclear - what is the reason of such
difference?

Uncommenting the {-2-} lines doesn't help. I thing the reason is in
some inner properties of the handlers, but have no idea in which one.

Max.