[Haskell-cafe] Re: Network parsing and parsec

Keean Schupke k.schupke at imperial.ac.uk
Tue Sep 20 10:17:11 EDT 2005


Here's the code from hGetContents (base/GHC/IO.lhs):

    -- we never want to block during the read, so we call fillReadBuffer 
with
    -- is_line==True, which tells it to "just read what there is".
    lazyReadBuffered h handle_ fd ref buf = do
       catch
            (do buf <- fillReadBuffer fd True{-is_line-} (haIsStream 
handle_) buf
                lazyReadHaveBuffer h handle_ fd ref buf
            )
            -- all I/O errors are discarded.  Additionally, we close the 
handle.
            (\e -> do handle_ <- hClose_help handle_
                      return (handle_, "")
            )

So, it reads whatever is available, further description is available 
from the definition
of fillReadBuffered:

    -- For a line buffer, we just get the first chunk of data to arrive,
    -- and don't wait for the whole buffer to be full (but we *do* wait
    -- until some data arrives).  This isn't really line buffering, but it
    -- appears to be what GHC has done for a long time, and I suspect it
    -- is more useful than line buffering in most cases.

So for a disc buffer I would expect 1 complete buffer to be returned 
most of the time, for
a network read, I guess one packet (MTUs) worth should be expected...


    Regards,
    Keean.





Keean Schupke wrote:

> John Goerzen wrote:
>
>> On Tue, Sep 20, 2005 at 02:29:12PM +0100, Keean Schupke wrote:
>>  
>>
>>>> It's unclear to me exactly how to mix the IO monad with Parsec.  It
>>>> doesn't really seem to be doable.
>>>>
>>>> Not to mention that if hGetContents is used, the Handle has to be put
>>>> into non-buffering mode, which means one syscall per character read.
>>>> Terribly slow.
>>>>
>>>>
>>>>
>>>>     
>>>
>>> Does it? I didn't think so ...
>>>   
>>
>>
>> strace seems to say yes.
>>  
>>
> Thats odd, the source code  seems to suggest that when you read past 
> the end of the buffer
> it reads the next entire buffer (it has cases for each possible buffer 
> configuration, line, block and none) - and I can think of no reason 
> _why_ it cannot use buffering... I would think that it's a bug if it 
> is the case.
>
>    Regards,
>    Keean.
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe




More information about the Haskell-Cafe mailing list