At 01:45 PM 02-12-2001 -0300, Branden wrote: >I think having both copying-GC and refcounting-GC is a good idea. I may be >saying a stupid thing, since I'm not a GC expert, but I think objects that >rely on having their destructors called the soonest possible for resource >cleanup could use a refcount-GC, while other objects that don't need that >could use a copy-GC. I really don't know if this is really feasible, it's >only an idea now. I also note that objects that are associated to resources >aren't typically the ones that get shared much in Perl, so using refcount >for them wouldn't be very expensive... > >Am I too wrong here? It's... complicated... Here's an example of where things could go wrong: sub foo { my $destroyme1 = new SomeClass; my $destroyme2 = new SomeClass; my @processme1; my @processme2; ... push @processme1, $destroyme1; push @processme2; $destroyme2; ... return \@processme2; } At the end of &foo(), $destroyme1 and $processme1 are dead, but $destroyme2 is alive. If $destroyme1 and $destroyme2 are ref-counted, but @processme1 and @processme2 are not, then at the end of &foo(), both objects will have ref-counts of 1 ($destroyme1 because of the ref from @processme1, which is a spurious ref-count; $destroyme2 because of the ref from @processme2, which is valid). $destroyme1 won't be destroyed until @processme1 is finalized, presumably by the GC, which could take a long time. That ref-count from @processme1 is necessary because if @processme1 escapes scope (like @processme2 did) then $destroyme1 is still alive, and can't be finalized. Going with full ref-counts solves the problem, because when @proccessme1 goes out of scope, it's ref-count drops to 0, and it gets finalized immediately, thus dropping $destroyme1 to 0, and it gets finalized. But with @processme2, its refcount drops from 2 to 1, so it survives and so does $destroyme2. Full ref-counting has a potentially large overhead for values that don't require finalization, which is likely the majority of our data. Going with partial ref-counts solves the simple case when the object is only referred to by objects with ref-counts, but could allow some objects' finalization to be delayed until the GC kicks in. Going with no ref-counts doesn't have the overhead of full refcounting, but unless some other mechanism (as yet undescribed) helps, finalization on all objects could be delayed until GC. >- BrandenThread Previous | Thread Next