Junio C Hamano <gits...@pobox.com> writes:

> Michael J Gruber <g...@drmicha.warpmail.net> writes:
>
>> diff --git a/object.h b/object.h
>> index 97d384b..695847d 100644
>> --- a/object.h
>> +++ b/object.h
>> @@ -13,6 +13,7 @@ struct object_array {
>>              struct object *item;
>>              const char *name;
>>              unsigned mode;
>> +            struct object_context *context;
>>      } *objects;
>>  };
>
> fsck has to hold this for each and every objects in the repository
> it has found but hasn't inspected (i.e. pending), doesn't it? Do we
> really want to add 8 bytes for each of them?

Perhaps fsck does not even want "name" and "mode" for that matter.

I wonder what improvement, if any, we would see with a change like
this patch in a large-ish repository.

 builtin/fsck.c | 35 ++++++++++++++++++++++++++++++-----
 1 file changed, 30 insertions(+), 5 deletions(-)

diff --git a/builtin/fsck.c b/builtin/fsck.c
index bb9a2cd..c1de2a9 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -73,7 +73,32 @@ static int fsck_error_func(struct object *obj, int type, 
const char *err, ...)
        return (type == FSCK_WARN) ? 0 : 1;
 }
 
-static struct object_array pending;
+static struct pending_object {
+       unsigned int nr;
+       unsigned int alloc;
+       struct object **objects;
+} pending;
+
+static int max_pending;
+
+static void add_pending(struct object *object)
+{
+       unsigned nr = pending.nr;
+       unsigned alloc = pending.alloc;
+       struct object **objects = pending.objects;
+
+       if (nr >= alloc) {
+               alloc = (alloc + 32) * 2;
+               objects = xrealloc(objects, alloc * sizeof(*objects));
+               pending.alloc = alloc;
+               pending.objects = objects;
+       }
+       objects[nr] = object;
+       pending.nr = ++nr;
+
+       if (max_pending < nr)
+               max_pending = nr;
+}
 
 static int mark_object(struct object *obj, int type, void *data)
 {
@@ -112,7 +137,7 @@ static int mark_object(struct object *obj, int type, void 
*data)
                return 1;
        }
 
-       add_object_array(obj, (void *) parent, &pending);
+       add_pending(obj);
        return 0;
 }
 
@@ -148,15 +173,15 @@ static int traverse_reachable(void)
        if (show_progress)
                progress = start_progress_delay("Checking connectivity", 0, 0, 
2);
        while (pending.nr) {
-               struct object_array_entry *entry;
-               struct object *obj;
+               struct object **entry, *obj;
 
                entry = pending.objects + --pending.nr;
-               obj = entry->item;
+               obj = *entry;
                result |= traverse_one_object(obj);
                display_progress(progress, ++nr);
        }
        stop_progress(&progress);
+       fprintf(stderr, "max# pending objects = %d\n", max_pending);
        return !!result;
 }
 
--
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