#4041: possible misbehaviour of hGet/hGetBuf
---------------------------------+------------------------------------------
    Reporter:  duncan            |       Owner:                             
        Type:  bug               |      Status:  new                        
    Priority:  normal            |   Component:  libraries/base             
     Version:  6.12.1            |    Keywords:                             
          Os:  MacOS X           |    Testcase:                             
Architecture:  Unknown/Multiple  |     Failure:  Incorrect result at runtime
---------------------------------+------------------------------------------
 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 <[email protected]>
   * 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).

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/4041>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to