Code

Fix grow_refs_hash()
authorLinus Torvalds <torvalds@osdl.org>
Wed, 21 Jun 2006 18:01:12 +0000 (11:01 -0700)
committerJunio C Hamano <junkio@cox.net>
Wed, 21 Jun 2006 19:39:39 +0000 (12:39 -0700)
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>
object-refs.c

index a7d49c60d7176fbc90635e07dc2ce658125edafc..b1b8065851b2723a57e5d6ab0859ca72e52fd55f 100644 (file)
@@ -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;
 }