[Haskell-cafe] semi-closed handles

Brent Yorgey byorgey at gmail.com
Mon Apr 14 13:28:09 EDT 2008


2008/4/14 Abhay Parvate <abhay.parvate at gmail.com>:

> Hello,
>
> In describing the Handle type, the GHC documentation says (in the
> System.IO documentation):
>
> GHC note: a Handle will be automatically closed when the garbage collector
> detects that it has become unreferenced by the program. However, relying on
> this behaviour is not generally recommended: the garbage collector is
> unpredictable. If possible, use explicit an explicit hClose to close Handles
> when they are no longer required. GHC does not currently attempt to free up
> file descriptors when they have run out, it is your responsibility to ensure
> that this doesn't happen.
>
> But one cannot call hClose on Handles on which something like hGetContents
> has been called; it just terminates the character list at the point till
> which it has already read. Further the manual says that hGetContents puts
> the handle in the semi-closed state, and further,
>
> A semi-closed handle becomes closed:
>
>    - if hClose is applied to it;
>    - if an I/O error occurs when reading an item from the handle;
>    - or once the entire contents of the handle has been read.
>
> So do I safely assume here, according to the third point above, that it's
> fine if I do not call hClose explicitly as far as I am consuming all the
> contents returned by hGetContents?
>

Yes, not only is it fine, it's recommended!  Calling hClose explicitly on a
handle after calling hGetContents is a sure way to introduce bugs.

-Brent
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20080414/fddc1e50/attachment.htm


More information about the Haskell-Cafe mailing list