Luke Palmer <[EMAIL PROTECTED]> wrote:
> Leopold Toetsch writes:
>>
>> Can you summarize your scheme again please WRT this and other
>> enhancements. I'm somewhat lost in all the improvements that were
>> proposed since your original.
> Alright, here's a patch that implements it.
Wow.
Some remarks:
First of course did you test & benchmark it? Please ...
(Allocate 10^x PMCs into some aggregates. Then: set active object(s) in
the root set, then do 2 or 3 "sweep 1" for cache settling, then time a
"sweep 1" against a "sweep 0". The same with some active objects deeper
buried inside a nested structure)
> Bear with me, because I don't know my way around the DOD very well.
> First, do I increment num_early_DOD_PMCs in the right place? That's
> where it was set to 1 before...
Looks good.
I didn't look, but do you decrement the counter, when such an object
gets destroyed?
> Also, the critical block that makes this an optimization is missing,
> marked with an XXX. I didn't implement it because I don't really know
> the control flow of DOD, so I didn't know how to abort cleanly. Can
> someone give me some hints here?
It should probably be inside trace_children's loop. Then, when you have
all your num_early_DOD_PMCs seen, you just leave the loop for the lazy
case. That's it.
Please note: you don't have to worry about GC. It might be inefficient
to move already dead object buffers around, but this is the way its done
currently. (Another thing to benchmark - though)
> Other than those few, but unignorable, caveats, Enjoy!
> + && interpreter->dod_trace_ptr) {
> + /* put it at the head of the list */
> + }
> + else {
> + /* put it on the end of the list */
/Me thinks, Dan will not like that part. Seems to break his
serialization scheme.
leo