On 12-01-19 02:16 PM, Serge D. Mechveliani wrote:
-- Main.hs ---------------------------------------------------------
            hPutStr h1 str
            hFlush h1

This fails to send a newline.

----------------------- fifo2.c -------------------------------------
   if (fgets(str, BOUND, toA) == NULL) {

This refuses to finish until it sees a newline (or BOUND chars, or the eof condition, or an error condition).

What really interests me is that if Main.hs is linked with -threaded, the deadlock is unlocked, and both programs proceed to completion.

This is because the -threaded runtime goes through garbage collection when idling (such as waiting for hGetLine). Since there is no further reference to h1 by then, GC hCloses it. That unlocks the fgets side.

This is fragile and not to be relied on. You will always have further references to h1 in practice.

Comparison with C - C
---------------------
If both programs are in C, then the whole loop of the string exchange
(with  fifo2.c  rewritten into a loop) works as needed, both for the
variants with fgets and with `read'.

I am not convinced in the case of fgets. I cannot reproduce it. (Oh, I know read has a much better chance, it doesn't wait for a newline.)

_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to