diff options
author | Sergey Vlasov <vsu@altlinux.ru> | 2005-11-15 19:08:08 +0300 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2005-11-15 11:42:29 -0800 |
commit | 4a4e6fd74f7d4564ed43eaaf59b6bd70c1959f1a (patch) | |
tree | 505862d83f5f0ffae0a2d024e7d0bfb336ddf560 /fsck-objects.c | |
parent | 545f229a4b43212e683ac63e5aa740324ac7799e (diff) | |
download | git-4a4e6fd74f7d4564ed43eaaf59b6bd70c1959f1a.tar.gz git-4a4e6fd74f7d4564ed43eaaf59b6bd70c1959f1a.tar.xz |
Rework object refs tracking to reduce memory usage
Store pointers to referenced objects in a variable sized array instead
of linked list. This cuts down memory usage of utilities which use
object references; e.g., git-fsck-objects --full on the git.git
repository consumes about 2 MB of memory tracked by Massif instead of
7 MB before the change. Object refs are still the biggest consumer of
memory (57%), but the malloc overhead for a single block instead of a
linked list is substantially smaller.
Signed-off-by: Sergey Vlasov <vsu@altlinux.ru>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'fsck-objects.c')
-rw-r--r-- | fsck-objects.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/fsck-objects.c b/fsck-objects.c index c1b279efc..0433a1d0d 100644 --- a/fsck-objects.c +++ b/fsck-objects.c @@ -56,7 +56,6 @@ static void check_connectivity(void) /* Look up all the requirements, warn about missing objects.. */ for (i = 0; i < nr_objs; i++) { struct object *obj = objs[i]; - struct object_list *refs; if (!obj->parsed) { if (!standalone && has_sha1_file(obj->sha1)) @@ -67,14 +66,19 @@ static void check_connectivity(void) continue; } - for (refs = obj->refs; refs; refs = refs->next) { - if (refs->item->parsed || - (!standalone && has_sha1_file(refs->item->sha1))) - continue; - printf("broken link from %7s %s\n", - obj->type, sha1_to_hex(obj->sha1)); - printf(" to %7s %s\n", - refs->item->type, sha1_to_hex(refs->item->sha1)); + if (obj->refs) { + const struct object_refs *refs = obj->refs; + unsigned j; + for (j = 0; j < refs->count; j++) { + struct object *ref = refs->ref[j]; + if (ref->parsed || + (!standalone && has_sha1_file(ref->sha1))) + continue; + printf("broken link from %7s %s\n", + obj->type, sha1_to_hex(obj->sha1)); + printf(" to %7s %s\n", + ref->type, sha1_to_hex(ref->sha1)); + } } if (show_unreachable && !(obj->flags & REACHABLE)) { |