Re: pack-objects: Fix segfault when object count is less than thread count
On Mon, 21 Jan 2008, Sergey Vlasov wrote:
Show 32 quoted lines
> On Mon, Jan 21, 2008 at 11:07:15AM -0500, Nicolas Pitre wrote:
> > On Mon, 21 Jan 2008, Sergey Vlasov wrote:
> >
> > > When partitioning the work amongst threads, dividing the number of
> > > objects by the number of threads may return 0 when there are less
> > > objects than threads; this will cause the subsequent code to segfault
> > > when accessing list[sub_size-1]. Fix this by ensuring that sub_size
> > > is not zero if there is at least one object to process.
> >
> > No. Forcing one object in a thread is counter productive since it won't
> > have anything to delta against. Instead, the thread should be allowed
> > to have zero objects and let the other threads have more.
> >
> > This patch would be a proper fix:
> >
> > diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c
> > index ec10238..d3efeff 100644
> > --- a/builtin-pack-objects.c
> > +++ b/builtin-pack-objects.c
> > @@ -1672,7 +1672,8 @@ static void ll_find_deltas(struct object_entry **list, unsigned list_size,
> > p[i].data_ready = 0;
> >
> > /* try to split chunks on "path" boundaries */
> > - while (sub_size < list_size && list[sub_size]->hash &&
> > + while (sub_size && sub_size < list_size &&
> > + list[sub_size]->hash &&
> > list[sub_size]->hash == list[sub_size-1]->hash)
> > sub_size++;
>
> Actually there will not be any significant differences - with my patch
> the object distribution between threads will be 1, 1, ..., 0, 0...,
> and with your patch it would be 0, 0, ..., 1, 1, ...
Or more likely 0, 0, ..., 2.
And the code is simpler.
> We could even introduce some limit on the number of objects below
> which multithreaded packing is not attempted, so that packing a small
> number of objects would be more efficient.
Possibly. But that's not a requirement at this moment.
Nicolas