On Sun, Aug 17, 2003 at 05:48:14AM -0600, Luke Palmer wrote:
> Here comes that ever-reincarnating thread again, sorry.
> 
> This is a proposal for an efficient solution to the timely destruction
> problem, which doesn't use refcounting, and fits in to the current
> scheme pretty well.

I don't quite follow all the below (probably mainly due to my
infamiliarity with parrot's DOD/GC stuff).

Would it be possible to illuminate it by explaining how the following
Perl5 code (presumably being executed by Ponie/Parrot) would ensure that
the two destructors are called at the places marked:

    {
        my $ref;
        {
            my $obj1 = Foo->new(...);
            my $obj2 = Foo->new(...);
            $ref = $obj1;
        } # $obj2->DESTROY called here
        # ...
    } # $obj1->DESTROY called here
    # ...
    
> 
> It is based on the fact that 90% of the time (or more), all objects
> needing timely destruction will be found live.  It uses a priority
> method to try to find these objects quickly, and ceases if it does.
> This behavior is only carried out if the DOD was invoked by C<sweep 0>.
> 
> There is an external list of objects needing timely destruction, which
> is not walked by DOD.  Each object has a DOD_high_priority_FLAG.  Each
> time an impatient object is created, its high_priority_FLAG is set.
> 
> As everything is walked, if an object with this flag set is encountered,
> whichever thing referenced it also gets the flag set[1].  
> 
> The DOD queue has two segments:  high_priority and low_priority.
> high_priority is always drained and processed first.  When this portion
> of the queue is completely drained, the external list of impatient
> objects is checked.  If every object has been marked live, DOD
> terminates (and GC is not allowed to run, because that would result in a
> lot of wrongly murdered objects).  If there are dead objects in that
> list, DOD continues and does a full sweep.
> 
> When an impatient object is destructed, it might be good to reset all
> high_priority_FLAGs, except for other impatient objects, so there is
> nothing being walked at high priority that doesn't deserve it.
> 
> That's it.  The first few times C<sweep 0> is run, it will take just as
> long as C<sweep 1>, but the priorities will propogate down to things in
> the root set, and it will begin to speed up.  And the algorithmic
> complexity never exceeds that of a regular sweep[2].
> 
> Luke
> 
> [1] This probably has to be done when the object is enqueued, not
> dequeued.  I don't know whether this impacts performance significantly.
> See [2].
> 
> [2] Although a single cycle of the algorithm becomes more complex, so it
> will slow things down a little when it's not doing any good.  But at the
> expense of a little templating, these checks could be eliminated when
> the sweep wasn't triggered by C<sweep 0>.

-- 
print+qq&$}$"$/$s$,[EMAIL PROTECTED],$:$.$q$^$,[EMAIL 
PROTECTED];$.$q$m&if+map{m,^\d{0\,},,${$::{$'}}=chr($"+=$&||1)}q&10m22,42}6:[EMAIL 
PROTECTED];^2$g3q/s"&=~m*\d\*.*g

Reply via email to