[Ecls-list] Finalizer, weak pointer, weak hashes etc.

Marco Gidde marco.gidde at tiscali.de
Sat Apr 26 13:04:02 UTC 2008

"Juan Jose Garcia-Ripoll"
<jjgarcia at users.sourceforge.net> writes:

> On Thu, Apr 24, 2008 at 9:32 PM, Marco Gidde <marco.gidde at tiscali.de> wrote:
>>  ... the user can easily turn of the internal object finalization
>>  (ie. closing streams) with
> Yes, that is a feature, not a big issue. You should set it to T if you
> want the default finalizing code. But perhaps this semantics is not
> very clear.

The problem IMHO is that user code might do it unintentionally: one
might register a finalizer as some kind of safety net. Later, under
certain conditions, it might be possible to explicitly call the
finalizer and - to avoid the GC overhead - unregister it again. It can't
be expected that users know those types, for which ECL defines its own
finalizers, so to be sure, user code always had to (SET-FINALIZER T) or
check it with GET-FINALIZER before registering its own. This behaviour
should at least be made explicit in the documentation because I had not
expected a finalizer on a freshly created object.

>>  Weak pointers on the other hand seem to be quite simple: define a new
>>  type with a pointer to cl_object, allocate this cell with malloc_atomic
>>  and let GC_general_register_disappearing_link nullify it if appropriate.
>>  With these building blocks implementing weak hash tables is still some
>>  amount of work, but at least doable.
> My understanding is that this is not efficient and that disappearing
> links should be avoided if possible. I got this feedback from the GC
> mailing list long ago. Now I am not sure what they meant, as having a
> look at the garbage collector's code, they are implemented just like
> finalization.

I didn't take efficiency into account for the moment, just looked what
is there and what might be possible with that. Currently the situation
is just like this: if an application requires weak pointers or hashes,
ECL is not a choice, which is a bit sad.

> However, the real problem is that for scalable weak hashes it is not
> enough to have weak pointers. This is described here:
> http://www.haible.de/bruno/papers/cs/weak/WeakDatastructures-writeup.html
> and here http://www.haible.de/bruno/papers/cs/weak/WeakDatastructures-presentation.pdf

Thanks for the pointer. I see there is more about weak data structures
than I naively expected, but on the other side: with a level 2
implementation ECL would be in pretty good company. :-)

> Perhaps the simplest solution is, since we do not have control over
> the "sweep" phase in the collector, to go for finalization. One could
> add an "internal" finalization phase as you describe, storing objects
> with weak pointer references in a hash table and updating this table
> and clearing the associated pointers and conses when the object is
> finalized.

This seems to be all we can do with an external garbage collector.

But now I ask myself how to add weak hashes without messing up the code
in hash.d with lots of checks for weak keys/values and letting the user
pay for a feature he/she usually don't want. Still have to think and
maybe start with the simple things, but don't hold your breath - time is
scarce over here :-/

Regards, Marco

More information about the ecl-devel mailing list