diff options
author | Linus Torvalds <torvalds@osdl.org> | 2006-06-21 11:01:12 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-06-21 12:39:39 -0700 |
commit | 5fdc8499658969e5ed03184f87cb4290541a0763 (patch) | |
tree | c14cdf204d317e65f584c6015f862394e77a7e47 | |
parent | 86f660b1f1dc207897281a77f969a56b2e551374 (diff) | |
download | git-5fdc8499658969e5ed03184f87cb4290541a0763.tar.gz git-5fdc8499658969e5ed03184f87cb4290541a0763.tar.xz |
Fix grow_refs_hash()
Earlier commit 3e4339e6f96e8c4f38a9c6607b98d3e96a2ed783 had a
thinko that did not check for collisions while repopulating the
objects in the new hash table.
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r-- | object-refs.c | 30 |
1 files changed, 14 insertions, 16 deletions
diff --git a/object-refs.c b/object-refs.c index a7d49c60d..b1b806585 100644 --- a/object-refs.c +++ b/object-refs.c @@ -12,6 +12,18 @@ static unsigned int hash_obj(struct object *obj, unsigned int n) return hash % n; } +static void insert_ref_hash(struct object_refs *ref, struct object_refs **hash, unsigned int size) +{ + int j = hash_obj(ref->base, size); + + while (hash[j]) { + j++; + if (j >= size) + j = 0; + } + hash[j] = ref; +} + static void grow_refs_hash(void) { int i; @@ -20,30 +32,16 @@ static void grow_refs_hash(void) new_hash = calloc(new_hash_size, sizeof(struct object_refs *)); for (i = 0; i < refs_hash_size; i++) { - int j; struct object_refs *ref = refs_hash[i]; if (!ref) continue; - j = hash_obj(ref->base, new_hash_size); - new_hash[j] = ref; + insert_ref_hash(ref, new_hash, new_hash_size); } free(refs_hash); refs_hash = new_hash; refs_hash_size = new_hash_size; } -static void insert_ref_hash(struct object_refs *ref) -{ - int j = hash_obj(ref->base, refs_hash_size); - - while (refs_hash[j]) { - j++; - if (j >= refs_hash_size) - j = 0; - } - refs_hash[j] = ref; -} - static void add_object_refs(struct object *obj, struct object_refs *ref) { int nr = nr_object_refs + 1; @@ -51,7 +49,7 @@ static void add_object_refs(struct object *obj, struct object_refs *ref) if (nr > refs_hash_size * 2 / 3) grow_refs_hash(); ref->base = obj; - insert_ref_hash(ref); + insert_ref_hash(ref, refs_hash, refs_hash_size); nr_object_refs = nr; } |