[plt-scheme] Re: [plt-edu] Re: animation projects, video-game and not

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Sat Feb 7 17:04:00 EST 2009

1. I am aware of the file and db example. I just explained all this  
to a visitor on friday (who requested gc'ed file handles).

2. YC's original message alluded to memory, which is usually not  
subject to special treatment but gc'ed.

3. And yes, I know about external resource management. I write my  
programs with call-with- and custodians.

-- Matthias





On Feb 7, 2009, at 4:38 PM, Shriram Krishnamurthi wrote:

>>> A database
>>> library certainly could, and should, use the garbage collector to
>>> close connections.  I don't know which ones do, but that's only  
>>> my own
>>> inexperience with Scheme database libraries.  In both cases, GC
>>> doesn't preclude the option to manually close a connection  
>>> earlier --
>>> but GC makes that into an optimization rather than a necessity, for
>>> most purposes.
>>
>> GC is a poor fit for scarce resources like file handles. It's  
>> partly a
>> mismatch between scarce resources and the plentiful resource of  
>> memory,
>> but OS and library limitations are the main factor.
>
> A better example is an externally managed data structure.  For
> instance, when we linked to decision diagrams -- which are managed
> internally in a library, through reference counts -- we used wills to
> inform the library that there were no more references from Scheme.
> That is, all of Scheme is a ++ ref, and dropping all references from
> Scheme is a -- ref.  This is a good fit for wills, because the
> granularity is the same; the wills are just massaging over differences
> in storage and management strategy.
>
>> Now suppose that you want to use an external library that happens to
>> open some configuration file internally. That library isn't going to
>> know that it should force a GC if opening the configuration file  
>> fails,
>> so making the library work nicely in a GCed-file-handle world is  
>> going
>> to be a big pain, at best. (This is also why it would be difficult to
>> get right within the run-time system.)
>
> Isn't it worse?  Usually, external libraries are not written with the
> assumption that files close without their say-so.  That means a
> perverse bit of code might allocate a file, temporarily lose a direct
> reference to it, but re-acquire reference through some system
> mechanism (such as referring to the file pointer).  [To put it
> differently, reachability might involve the OSes internal data
> structures, which are generally not considered for tracing.]  Such a
> library would now behave faultily.
>
>> Meanwhile, wouldn't the closest analogue to automatic C++ init/ 
>> destruct
>> for a block be `call-with-...' functions, such as
>> `call-with-input-file'? Those use `dynamic-wind' to ensure that the
>> file is explicitly closed when control leaves the `call-with-...'
>> invocation.
>
> Indeed, the Wikipedia article mentions UNWIND-PROTECT.
>
> Shriram



Posted on the users mailing list.