[ ghc-Bugs-734716 ] ghc-5.05: handle closed by hselect
SourceForge.net
noreply at sourceforge.net
Tue May 13 08:17:27 EDT 2003
Bugs item #734716, was opened at 2003-05-08 17:52
Message generated for change (Comment added) made by volkersf
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=108032&aid=734716&group_id=8032
Category: hslibs/util
Group: None
Status: Open
Resolution: None
Priority: 5
Submitted By: Nobody/Anonymous (nobody)
Assigned to: Nobody/Anonymous (nobody)
Summary: ghc-5.05: handle closed by hselect
Initial Comment:
The included program, compiled with ghc-5.05 fails with the error
Fail: illegal operation
Action: hGetChar
Handle: {loc=<socket: 4>,type=duplex (read-
write),binary=True,buffering=none}
Reason: handle is closed
File: <socket: 4>
The error occurs on both Mac OS X 10.2.6 and FreeBSD 4.7.
The program works as expected when compiled with ghc-5.04.2.
module Main where
import Select
import Network
import Network.Socket
import IO
portId = (PortNumber portNum)
portNum = 9099
main = do
sock <- listenOn portId
(handle,_,_) <- Network.accept sock
putStrLn ("Read")
c <- (hGetChar handle)
putStrLn ("Got: " ++ show c)
----------------------------------------------------------------------
Comment By: Volker Stolz (volkersf)
Date: 2003-05-13 14:17
Message:
Logged In: YES
user_id=126328
Ah, yes, now I can reprocduce it and it all makes perfect sense: hSelect uses handleToFd which as a side effect closes the descriptor. This means you cannot use the (Haskell) handle afterwards. Please use e.g. dup, or, even better, try to avoid hSelect altogether. Don't forget that usually there's no need for select()ing first.
handleToFd h = withHandle "handleToFd" h $ \ h_ -> do
-- converting a Handle into an Fd effectively means
-- letting go of the Handle; it is put into a closed
-- state as a result.
----------------------------------------------------------------------
Comment By: Nobody/Anonymous (nobody)
Date: 2003-05-13 12:03
Message:
Logged In: NO
Somehow the only important line (hSelect) got lost in the submission.
module Main where
import Select
import Network
import Network.Socket
import IO
portId = (PortNumber portNum)
portNum = 9099
main = do
sock <- listenOn portId
(handle,_,_) <- Network.accept sock
hSelect [handle] [] [] Nothing
putStrLn ("Read")
c <- (hGetChar handle)
putStrLn ("Got: " ++ show c)
Compiled with ghc --make M1 -o M1 -package network -package util this
fails with
Fail: illegal operation
Action: hGetChar
Handle: {loc=<socket: 4>,type=duplex (read-
write),binary=True,buffering=block (1024)}
Reason: handle is closed
File: <socket: 4>
----------------------------------------------------------------------
Comment By: Volker Stolz (volkersf)
Date: 2003-05-10 17:22
Message:
Logged In: YES
user_id=126328
Do you mean hGetChar instead of hSelect? The Select-module is in the deprecated hslibs-branch and you do not use it in your program.
It works fine with recent ghc-5.05 from CVS on FreeBSD 4.8-STABLE if I comment out the 'import Select' and compile with -package network.
Maybe you should update your snapshot and try again.
----------------------------------------------------------------------
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=108032&aid=734716&group_id=8032
More information about the Glasgow-haskell-bugs
mailing list