Re[4]: [Haskell-cafe] GC'ing file handles and other resources

2008-04-16 Thread Bulat Ziganshin
Hello Abhay,

Wednesday, April 16, 2008, 10:51:07 AM, you wrote:

 I am not saying that it should claim it as soon as it is unused;
 all I am saying that as soon as a priority object becomes
 unreferenced, it should be the first choice for collecting in the next 
 collect.

on the GC, all unreferenced objects are collected. there is no
difference which ones will be collected first - anyway program is
stopped until whole GC will be finished

 Further I was under the impression (I may be wrong) that it uses a
 generational GC and therefore scans allocated memory incrementally;
 not the whole at a time. Please correct me if I am wrong.

yes, it uses generational GC. data are first allocated in small 256k block
and when it is filled, GC for this small block occurs. data that are
still alive then moved to the global heap. this minor GC doesn't scan
global heap. if it will do this, each minor GC will become as slow as
major ones

Generational garbage collection for Haskell
http://research.microsoft.com/~simonpj/Papers/gen-gc-for-haskell.ps.gz

  
 Regards,
 Abhay

 On Wed, Apr 16, 2008 at 11:55 AM, Bulat Ziganshin
 [EMAIL PROTECTED] wrote:
  Hello Abhay,
  
  Wednesday, April 16, 2008, 9:30:34 AM, you wrote:
  
  i think it will not work with current ghc GC - it scans entire
  memory/nursery when garbage collected so anyway you will need to wait
  until next GC event occurs
  

  Your mail gives me an idea, though I am not an iota familiar with
  compiler/garbage collector internals. Can we have some sort of
  internally maintained priority associated with allocated objects?
  The garbage collector should look at these objects first when it
  tries to free anything. The objects which hold other system
  resources apart from memory, such as file handles, video memory, and
  so on could be allocated as higher priority objects. Is such a thing 
  possible?
 
  2008/4/16 Conal Elliott [EMAIL PROTECTED]:
   Are Haskell folks satisfied with the practical necessity of
  imperatively  explicitly reclaiming resources such as file handles,
  fonts  brushes, video memory chunks, etc?  Doesn't explicit freeing
  of these resources have the same modularity and correctness problems
  as explicit freeing of system memory (C/C++ programming)?
 
  I wrote a lovely purely functional graphics library that used video
  memory to lazily compute and cache infinite-resolution images, and I
  found that I don't know how to get my finalizers to run anytime soon
  after video memory chunks become inaccessible.  Explicit freeing
  isn't an option, since the interface is functional, not imperative (IO).
 
  I guess I'm wondering a few things:
  
  * Are Haskell programmers generally content with imperative and
  bug-friendly interfaces involving explicit freeing/closing of resources?
  * Do people assume that these resources (or handling them frugally)
  aren't useful in purely functional interfaces?
   * Are there fundamental reasons why GC algorithms cannot usefully
  apply to resources like video memory, file descriptors, etc?
  * Are there resource management techniques that have the
  flexibility, efficiency, and accuracy of GC that I could be using for these 
  other resources?
 
  Thanks,
    - Conal
  
  2008/4/14 Abhay Parvate [EMAIL PROTECTED]:
   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?
  
  Thanks,
  Abhay
 
  ___
   Haskell-Cafe mailing list
  [EMAIL PROTECTED]
   http://www.haskell.org/mailman/listinfo/haskell-cafe
 
  
  
 
  ___
   Haskell-Cafe mailing list
  [EMAIL PROTECTED]
   http://www.haskell.org/mailman/listinfo/haskell-cafe
 
  
  
 
  
  
  
 --
  Best regards,
   Bulat                            mailto:[EMAIL 

Re: Re[4]: [Haskell-cafe] GC'ing file handles and other resources

2008-04-16 Thread Abhay Parvate
Thanks, both for the summary and for the link. Will try to go through it.

Regards,
Abhay

On Wed, Apr 16, 2008 at 12:37 PM, Bulat Ziganshin [EMAIL PROTECTED]
wrote:

 Hello Abhay,

 Wednesday, April 16, 2008, 10:51:07 AM, you wrote:

  I am not saying that it should claim it as soon as it is unused;
  all I am saying that as soon as a priority object becomes
  unreferenced, it should be the first choice for collecting in the next
 collect.

 on the GC, all unreferenced objects are collected. there is no
 difference which ones will be collected first - anyway program is
 stopped until whole GC will be finished

  Further I was under the impression (I may be wrong) that it uses a
  generational GC and therefore scans allocated memory incrementally;
  not the whole at a time. Please correct me if I am wrong.

 yes, it uses generational GC. data are first allocated in small 256k block
 and when it is filled, GC for this small block occurs. data that are
 still alive then moved to the global heap. this minor GC doesn't scan
 global heap. if it will do this, each minor GC will become as slow as
 major ones

 Generational garbage collection for Haskell
 http://research.microsoft.com/~simonpj/Papers/gen-gc-for-haskell.ps.gzhttp://research.microsoft.com/%7Esimonpj/Papers/gen-gc-for-haskell.ps.gz

 
  Regards,
  Abhay

  On Wed, Apr 16, 2008 at 11:55 AM, Bulat Ziganshin
  [EMAIL PROTECTED] wrote:
   Hello Abhay,
 
   Wednesday, April 16, 2008, 9:30:34 AM, you wrote:
 
   i think it will not work with current ghc GC - it scans entire
   memory/nursery when garbage collected so anyway you will need to wait
   until next GC event occurs
 

   Your mail gives me an idea, though I am not an iota familiar with
   compiler/garbage collector internals. Can we have some sort of
   internally maintained priority associated with allocated objects?
   The garbage collector should look at these objects first when it
   tries to free anything. The objects which hold other system
   resources apart from memory, such as file handles, video memory, and
   so on could be allocated as higher priority objects. Is such a thing
 possible?
  
   2008/4/16 Conal Elliott [EMAIL PROTECTED]:
Are Haskell folks satisfied with the practical necessity of
   imperatively  explicitly reclaiming resources such as file handles,
   fonts  brushes, video memory chunks, etc?  Doesn't explicit freeing
   of these resources have the same modularity and correctness problems
   as explicit freeing of system memory (C/C++ programming)?
  
   I wrote a lovely purely functional graphics library that used video
   memory to lazily compute and cache infinite-resolution images, and I
   found that I don't know how to get my finalizers to run anytime soon
   after video memory chunks become inaccessible.  Explicit freeing
   isn't an option, since the interface is functional, not imperative
 (IO).
  
   I guess I'm wondering a few things:
 
   * Are Haskell programmers generally content with imperative and
   bug-friendly interfaces involving explicit freeing/closing of
 resources?
   * Do people assume that these resources (or handling them frugally)
   aren't useful in purely functional interfaces?
* Are there fundamental reasons why GC algorithms cannot usefully
   apply to resources like video memory, file descriptors, etc?
   * Are there resource management techniques that have the
   flexibility, efficiency, and accuracy of GC that I could be using for
 these other resources?
  
   Thanks,
 - Conal
 
   2008/4/14 Abhay Parvate [EMAIL PROTECTED]:
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?
 
   Thanks,
   Abhay
  
   ___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org