This program listens on port 9000 and mirrors everything typed into the client onto stdout, IF it is working correctly.
In GHC 6.6 (and HEAD), it seems to block unexpectedly, and this strange behavior is related to hIsOpen and hIsEOF, somehow. It acts like hIsOpen or hIsEOF is holding up the loop until input arrives, but it still blocks at hGetLine. The server ends up printing out lines that were typed into the client a while ago, as if it were stuck on some kind of backlog but could not catch up. Not sure how to explain this without showing it, maybe this: Client: Server: ------- ------- line1 handle isOpen = True; isEOF = False line2 line1 line3 handle isOpen = True; isEOF = False line4 line2 line5 line6 line7 Client has typed 7 lines and sent them to the server, but the server has only printed out 2 lines. If you remove the hIsOpen and hIsEOF calls, then the server will print out all 7 lines immediately as they are submitted. > import Control.Concurrent > import Control.Concurrent.STM > import System.IO > import Network > main = withSocketsDo $ do > sock <- listenOn $ PortNumber 9000 > (h,_,_) <- accept sock > ch <- atomically newTChan > -- thread which pumps lines read > -- from socket into channel > forkIO . sequence_ . repeat $ > hGetLine h >>= atomically . writeTChan ch > -- main thread just waits for data from channel > -- and prints it to screen > sequence_ . repeat $ > do isOpen <- hIsOpen h > isEOF <- hIsEOF h > putStrLn $ "handle isOpen = " ++ show isOpen > ++ "; isEOF = " ++ show isEOF > hFlush stdout > line <- atomically $ readTChan ch > putStrLn line > hFlush stdout Any idea what's going on? -- -- Matthew Danish -- user: mrd domain: cmu.edu -- OpenPGP public key: C24B6010 on keyring.debian.org _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users