possible misbehaviour of hGet/hGetBuf
nominolo reports that the ByteString.hGet
does not have the behaviour it is documented to have. ByteString.hGet
is implemented almost directly in terms of System.IO.hGetBuf
.
Simon Marlow recently added this documentation to ByteString.hGet
:
-- If there is any data to read, then 'hGet' will not block, instead
-- it will return whatever data is available without blocking. It
-- only blocks if there is no data available to read.
nominolo reports that with ghc-6.12.1 on OSX SL, that the actual behaviour is that hGet
blocks until all the requested data is available, that is, it does not return a short read.
Simon clearly thinks that the documented behaviour of hGet is what the behaviour ought to be. In a previous patch to the ByteString
package he writes:
Mon Mar 22 15:39:14 GMT 2010 Simon Marlow <marlowsd@gmail.com>
* hGetContents: use hGet instead of hGetNonBlocking + hWaitForInput + hIsEOF
Not only is this cleaner, but it fixes a problem with read binary data
over a pipe, see
http://hackage.haskell.org/trac/ghc/ticket/3808
The problem is that bytestring normally works fine when the Handle is
not in binary mode, because it uses hGetBuf/hPutBuf which bypass the
encoding layer. That is, except in this one particular case:
hWaitForInput might do some decoding, because it has to determine
whether there are any characters (not bytes) available to be read.
I imagine hGetNonBlocking was used due to concerns that hGet might
block if there is insufficient data, but that's not the case; hGet
returns a short read if it would otherwise block, and only blocks if
there is no data to read.
So it's not entirely clear what is going on. It's either confusion or a bug (possibly a system-dependent one).
Trac metadata
Trac field | Value |
---|---|
Version | 6.12.1 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | libraries/base |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |