Andrew's git
/
gitweb.git
/ diff
summary
|
log
|
commit
| diff |
tree
commit
grep
author
committer
pickaxe
?
re
Fix grow_refs_hash()
author
Linus Torvalds
<torvalds@osdl.org>
Wed, 21 Jun 2006 18:01:12 +0000
(11:01 -0700)
committer
Junio 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
patch
|
blob
|
history
raw
|
patch
|
inline
| side by side (parent:
86f660b
)
diff --git
a/object-refs.c
b/object-refs.c
index a7d49c60d7176fbc90635e07dc2ce658125edafc..b1b8065851b2723a57e5d6ab0859ca72e52fd55f 100644
(file)
--- 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;
}
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;
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++) {
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;
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;
}
}
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;
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;
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;
}
nr_object_refs = nr;
}