Bugs item #1219920, was opened at 2005-06-13 14:34 Message generated for change (Comment added) made by pimlott You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=108032&aid=1219920&group_id=8032
Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: libraries/network Group: None Status: Closed Resolution: None Priority: 5 Submitted By: Andrew Pimlott (pimlott) Assigned to: Simon Marlow (simonmar) Summary: socketToHandle, hGetContents cause errors in ghci Initial Comment: I wrote a server using socketToHandle and hGetContents. The first request worked fine, but the second request crashed with "internal error: scavenge_stack: weird activation record found on stack: 9". I tried to create a test case. I couldn't reproduce the same problem, but I did get an intermittent "Bad file descriptor". I think it may be a related problem, and it may have to do with garbage collection (based on a strace showing a call to getrusage). The program is below, and when I run it with runghc and feed it a line of input with nc, it crashes on the 17th request. It's not important to me that you fix it; in fact I only tried this as an experiment to simplify some working code. But if you would like more information, let me know. I am using the Debian package ghc6 6.4-4. import Network.Socket import System.IO main = do s <- socket AF_INET Stream 0 h <- inet_addr "127.0.0.1" bindSocket s (SockAddrInet 1236 h) listen s 5 loop s loop listenSock = do (s,_) <- accept listenSock h <- socketToHandle s ReadMode input <- hGetContents h putStrLn (take 10 input) send s "got it\n" sClose s loop listenSock ---------------------------------------------------------------------- >Comment By: Andrew Pimlott (pimlott) Date: 2005-07-06 12:00 Message: Logged In: YES user_id=498741 I should have detailed my test scenario, but what I see when I run "echo hello world | nc localhost 1236" repeatedly is that "hello worl" is printed 16 times, then *** Exception: <socket: 5>: lazyRead: invalid argument (Bad file descriptor) So the error happens while trying to print out "input". As I understand, input should keep a reference to h, which should keep a reference to s, so nothing should get garbage collected too soon. Moreover, something that happens later (sClose) shouldn't be able to affect it. That said, when I use hClose, or remove the close, I can't reproduce the problem. So I'm perplexed. Can I ask you to explain in more detail? ---------------------------------------------------------------------- Comment By: Simon Marlow (simonmar) Date: 2005-07-06 05:57 Message: Logged In: YES user_id=48280 The "Bad file descriptor" error messages are to be expected: when you turn a Socket into a Handle, it gets a finalizer attached which closes the socket when the Handle is no longer referenced. You want to call hClose h rather than sClose s in the code above. I've added some documentation for socketToHandle to reflect this. If you can reproduce the "scavenge_stack" error, please follow up with more info, for now I'll close this bug. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=108032&aid=1219920&group_id=8032 _______________________________________________ Glasgow-haskell-bugs mailing list Glasgow-haskell-bugs@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs