
Bugs
See the discussion of spurious readiness notifications under the BUGS
#13497: GHC does not use select()/poll() correctly on non-Linux platforms -------------------------------------+------------------------------------- Reporter: nh2 | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Runtime System | Version: 8.0.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: 8684 Related Tickets: #8684, #12912 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by nh2): Another thing I found: The comment on top of `fdReady()` says: {{{ "Input is available" is defined as 'can I safely read at least a *character* from this file object without blocking?' }}} But this seems to be not true in the general case: If the FD is for a socket, then it is only true when that socket is non- blocking. `man 2 poll` (see [https://linux.die.net/man/2/poll here]) describes this: section of select(2). `man 2 select` (see [https://linux.die.net/man/2/poll here]) says:
Under Linux, `select()` may report a socket file descriptor as "ready for reading", while nevertheless a subsequent read blocks. This could for example happen when data has arrived but upon examination has wrong checksum and is discarded. There may be other circumstances in which a file descriptor is spuriously reported as ready. Thus it may be safer to use `O_NONBLOCK` on sockets that should not block.
I have not investigated whether anywhere in GHC `fdReady()` is potentially called with a not-nonblocking socket. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13497#comment:26 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler