diff options
author | Linus Torvalds <torvalds@osdl.org> | 2006-06-18 11:45:02 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-06-18 13:51:27 -0700 |
commit | 3e4339e6f96e8c4f38a9c6607b98d3e96a2ed783 (patch) | |
tree | 75fa4df47e05371a6bfe8444338d2068ff2d1973 /object.c | |
parent | 9cd625b79babaf50f50a0e5d96903eaacb1ee600 (diff) | |
download | git-3e4339e6f96e8c4f38a9c6607b98d3e96a2ed783.tar.gz git-3e4339e6f96e8c4f38a9c6607b98d3e96a2ed783.tar.xz |
Remove "refs" field from "struct object"
This shrinks "struct object" to the absolutely minimal size possible.
It now contains /only/ the object flags and the SHA1 hash name of the
object.
The "refs" field, which is really needed only for fsck, is maintained in
a separate hashed lookup-table, allowing all normal users to totally
ignore it.
This helps memory usage, although not as much as I hoped: it looks like
the allocation overhead of malloc (and the alignment constraints in
particular) means that while the structure size shrinks, the actual
allocation overhead mostly does not.
[ That said: memory usage is actually down, but not as much as it should
be: I suspect just one of the object types actually ended up shrinking
its effective allocation size.
To get to the next level, we probably need specialized allocators that
don't pad the allocation more than necessary. ]
The separation makes for some code cleanup, though, and makes the ref
tracking that fsck wants a clearly separate thing.
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'object.c')
-rw-r--r-- | object.c | 70 |
1 files changed, 0 insertions, 70 deletions
@@ -13,8 +13,6 @@ const char *type_names[] = { "none", "blob", "tree", "commit", "bad" }; -int track_object_refs = 0; - static int hashtable_index(const unsigned char *sha1) { unsigned int i; @@ -55,7 +53,6 @@ void created_object(const unsigned char *sha1, struct object *obj) obj->parsed = 0; memcpy(obj->sha1, sha1, 20); obj->type = TYPE_NONE; - obj->refs = NULL; obj->used = 0; if (obj_allocs - 1 <= nr_objs * 2) { @@ -84,73 +81,6 @@ void created_object(const unsigned char *sha1, struct object *obj) nr_objs++; } -struct object_refs *alloc_object_refs(unsigned count) -{ - struct object_refs *refs; - size_t size = sizeof(*refs) + count*sizeof(struct object *); - - refs = xcalloc(1, size); - refs->count = count; - return refs; -} - -static int compare_object_pointers(const void *a, const void *b) -{ - const struct object * const *pa = a; - const struct object * const *pb = b; - if (*pa == *pb) - return 0; - else if (*pa < *pb) - return -1; - else - return 1; -} - -void set_object_refs(struct object *obj, struct object_refs *refs) -{ - unsigned int i, j; - - /* Do not install empty list of references */ - if (refs->count < 1) { - free(refs); - return; - } - - /* Sort the list and filter out duplicates */ - qsort(refs->ref, refs->count, sizeof(refs->ref[0]), - compare_object_pointers); - for (i = j = 1; i < refs->count; i++) { - if (refs->ref[i] != refs->ref[i - 1]) - refs->ref[j++] = refs->ref[i]; - } - if (j < refs->count) { - /* Duplicates were found - reallocate list */ - size_t size = sizeof(*refs) + j*sizeof(struct object *); - refs->count = j; - refs = xrealloc(refs, size); - } - - for (i = 0; i < refs->count; i++) - refs->ref[i]->used = 1; - obj->refs = refs; -} - -void mark_reachable(struct object *obj, unsigned int mask) -{ - if (!track_object_refs) - die("cannot do reachability with object refs turned off"); - /* If we've been here already, don't bother */ - if (obj->flags & mask) - return; - obj->flags |= mask; - if (obj->refs) { - const struct object_refs *refs = obj->refs; - unsigned i; - for (i = 0; i < refs->count; i++) - mark_reachable(refs->ref[i], mask); - } -} - struct object *lookup_object_type(const unsigned char *sha1, const char *type) { if (!type) { |