Michael Haggerty <mhag...@alum.mit.edu> writes:

> There is no logical reason for this test to be here.  At the caller we
> might be able to figure out its meaning.
>
> Signed-off-by: Michael Haggerty <mhag...@alum.mit.edu>
> ---

I do not think this change is justified, *unless* the caller later
in the series gains a better heuristics than what can be done with
information in the object_array (namely, alloc and nr) to decide
when to trigger gc.

And I was hoping to see such a cleverness added to the caller, but I
do not think I saw any.

I would have to say gc_boundary() knows better when it needs to gc
with the code at this point in the series, and that is true also in
the final code after all the patches in this series.

If we keep the "when to gc" logic inside "gc", in 11/17 this caller
can no longer call directly to object_array_filter().  It should
call gc_boundary(), but I see it as a merit, not a downside.  The
"gc function can later be taught the high/low watermark logic you
alluded to in 10/17, and the growth/shrinkage characteristic you
would take advantage of while doing "gc" is specific to this
codepath.  And the logic still does not have to have access to
anything only the caller has access to; "gc" can work on what can be
read from the object_array->{alloc,nr} that is given to it.

  revision.c | 27 ++++++++++++---------------

>  1 file changed, 12 insertions(+), 15 deletions(-)
>
> diff --git a/revision.c b/revision.c
> index 8ac88d6..2e0992b 100644
> --- a/revision.c
> +++ b/revision.c
> @@ -2437,23 +2437,19 @@ static struct commit *get_revision_1(struct rev_info 
> *revs)
>  
>  static void gc_boundary(struct object_array *array)
>  {
> -     unsigned nr = array->nr;
> -     unsigned alloc = array->alloc;
> +     unsigned nr = array->nr, i, j;
>       struct object_array_entry *objects = array->objects;
>  
> -     if (alloc <= nr) {
> -             unsigned i, j;
> -             for (i = j = 0; i < nr; i++) {
> -                     if (objects[i].item->flags & SHOWN)
> -                             continue;
> -                     if (i != j)
> -                             objects[j] = objects[i];
> -                     j++;
> -             }
> -             for (i = j; i < nr; i++)
> -                     objects[i].item = NULL;
> -             array->nr = j;
> +     for (i = j = 0; i < nr; i++) {
> +             if (objects[i].item->flags & SHOWN)
> +                     continue;
> +             if (i != j)
> +                     objects[j] = objects[i];
> +             j++;
>       }
> +     for (i = j; i < nr; i++)
> +             objects[i].item = NULL;
> +     array->nr = j;
>  }
>  
>  static void create_boundary_commit_list(struct rev_info *revs)
> @@ -2577,7 +2573,8 @@ static struct commit *get_revision_internal(struct 
> rev_info *revs)
>               if (p->flags & (CHILD_SHOWN | SHOWN))
>                       continue;
>               p->flags |= CHILD_SHOWN;
> -             gc_boundary(&revs->boundary_commits);
> +             if (revs->boundary_commits.alloc <= revs->boundary_commits.nr)
> +                     gc_boundary(&revs->boundary_commits);
>               add_object_array(p, NULL, &revs->boundary_commits);
>       }
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to