
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