Luke Palmer <[EMAIL PROTECTED]> wrote:
> After many months of lying dormant, I figured I'd get my act together
> and adapt this patch to the few recent modifications.  And this time,
> I'm posting a benchmark!

Wow, thanks.

Some comments:

> -    b_PObj_needs_early_DOD_FLAG = 1 << 27,
> +    /* true if this is connected by some route to a needs_early_DOD object */
> +    PObj_high_priority_DOD_FLAG = 1 << 27,
> +    PObj_needs_early_DOD_FLAG = (1 << 27 | 1 << 28),

Moving the needs_early_DOD_FLAG out of the arena_flags is suboptimal
(and probably the reason for the 5% slowdown for the eager case). Now the
relevant flags is the high_priority_DOD_FLAG. If I get the patch right,
it gets set on the PMC itself and all its parents.

So it would be fine, if the high_priority_DOD_FLAG would be in the
arena_flags nibble. The tests in the fast path of pobject_lives can then
go away - PMCs that can contain other PMCs can't be the parent of PMCs
that need timely destruction, so that should work. And all PMCs, that
can contain other PMCs must have a PMC_EXT attached with the next_for_GC
pointer.

And if that helps, we can just say: If an object needs timely
destruction it must have the PMC_EXT struct attached, so that marking
is out of the fast path.

>@@ -45,21 +45,45 @@
>      UINTVAL *dod_flags = arena->dod_flags + ns;
>      if (*dod_flags & ((PObj_on_free_list_FLAG | PObj_live_FLAG) << nm))
>          return;
> +    if (*dod_flags & PObj_on_free_list_FLAG << nm)
> +        return;

This seems bogus, if the flag is set, the first test has succeeded.

> +    if (PObj_high_priority_DOD_TEST(obj) && interpreter->dod_trace_ptr)
> +        /* set obj's parent to high priority */
> +        PObj_high_priority_DOD_SET(interpreter->dod_trace_ptr);

That could go probably below, if the special_PMC_FLAG is set.

>@@ -84,23 +108,38 @@

> -    if (PObj_is_special_PMC_TEST(obj)) {
> +    if (*dod_flags & (PObj_is_special_PMC_FLAG << nm)) {

This seems to be the non-ARENA_DOD_FLAGS case, so above doesn't work.

leo

Reply via email to