A small program (which I haven't been able to strip down to a
minimal *failing* version ;) repeatedly opens sockets and does the
following (I tested with all permutations of hSetBuffering):
Socket.connectTo ...
hPutStrLn h "Data"
hPutStr h d
debug Io "Reading..:"
c <- hGetContents h
debug Io "."
print c
debug Io "*"
After several loops, the program fails with:
Io: "Reading..:"
Io: "."
Fail: failed
Action: lazyRead
Handle: {loc=<socket: 0>,type=semi-closed,binary=True,buffering=none}
Reason: Bad file descriptor
File: <socket: 0>
Which isn't surprising if you take a look at the attached strace. If you
read the trace bottom up, you'll find that someone's calling 'close' on
fd 4 (and it's not me!) which has already been closed some time ago.
Maybe somehow the finalizer for an old handle gets run and the
safety precautions in PrelHandle/PrelIO fail for some reason.
write(1, "Io: \"*\"\n", 8) = 8
open("/etc/protocols", O_RDONLY) = 0
fcntl(0, F_GETFD) = 0
fcntl(0, F_SETFD, FD_CLOEXEC) = 0
fstat(0, {st_mode=S_IFREG|0644, st_size=1339, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x40014000
read(0, "#\n# protocols\tThis file describe"..., 4096) = 1339
close(0) = 0
munmap(0x40014000, 4096) = 0
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 0
fcntl(0, F_GETFL) = 0x2 (flags O_RDWR)
fcntl(0, F_SETFL, O_RDWR|O_NONBLOCK) = 0
socket(PF_UNIX, SOCK_STREAM, 0) = 4
connect(4, {sin_family=AF_UNIX, path="
/var/run/.nscd_socket"}, 110) = -1 ECONNREFUSED
(Connection refused)
close(4) = 0
open("/etc/hosts", O_RDONLY) = 4
fcntl(4, F_GETFD) = 0
fcntl(4, F_SETFD, FD_CLOEXEC) = 0
fstat(4, {st_mode=S_IFREG|0644, st_size=699, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x40014000
read(4, "#\n# hosts This file desc"..., 4096) = 699
close(4) = 0
munmap(0x40014000, 4096) = 0
***************************************************************************
close(4) = -1 EBADF (Bad file descriptor)
close(0) = 0
close(0) = -1 EBADF (Bad file descriptor)
***************************************************************************
connect(0, {sin_family=AF_INET, sin_port=htons(8481),
sin_addr=inet_addr("127.0.0.1")}}, 16) = -1 EBADF (Bad file descriptor)
fcntl(2, F_GETFL) = 0x2 (flags O_RDWR)
write(2, "\nFail: ", 7) = 7
write(2, "failed\nAction: connect\nReason: B"..., 51) = 51
write(2, "\n", 1) = 1
_exit(1) = ?
--
Volker Stolz * [EMAIL PROTECTED] * PGP + S/MIME
_______________________________________________
Glasgow-haskell-bugs mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs