Andrew's git
/
gitweb.git
/ diff
summary
|
log
|
commit
| diff |
tree
commit
grep
author
committer
pickaxe
?
re
Document some functions defined in object.c
author
Michael Haggerty
<mhagger@alum.mit.edu>
Fri, 28 Feb 2014 16:29:17 +0000
(17:29 +0100)
committer
Junio C Hamano
<gitster@pobox.com>
Fri, 28 Feb 2014 21:18:09 +0000
(13:18 -0800)
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Acked-by: Nicolas Pitre <nico@fluxnic.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
object.c
patch
|
blob
|
history
object.h
patch
|
blob
|
history
raw
|
patch
|
inline
| side by side (parent:
1f91e79
)
diff --git
a/object.c
b/object.c
index 584f7acb36b68d17678b3fd6251105241794ea48..57a0890a87b66ea493337409606e57fd44d29f90 100644
(file)
--- a/
object.c
+++ b/
object.c
@@
-43,14
+43,32
@@
int type_from_string(const char *str)
die("invalid object type \"%s\"", str);
}
die("invalid object type \"%s\"", str);
}
+/*
+ * Return a numerical hash value between 0 and n-1 for the object with
+ * the specified sha1. n must be a power of 2. Please note that the
+ * return value is *not* consistent across computer architectures.
+ */
static unsigned int hash_obj(const unsigned char *sha1, unsigned int n)
{
unsigned int hash;
static unsigned int hash_obj(const unsigned char *sha1, unsigned int n)
{
unsigned int hash;
+
+ /*
+ * Since the sha1 is essentially random, we just take the
+ * required number of bits directly from the first
+ * sizeof(unsigned int) bytes of sha1. First we have to copy
+ * the bytes into a properly aligned integer. If we cared
+ * about getting consistent results across architectures, we
+ * would have to call ntohl() here, too.
+ */
memcpy(&hash, sha1, sizeof(unsigned int));
memcpy(&hash, sha1, sizeof(unsigned int));
- /* Assumes power-of-2 hash sizes in grow_object_hash */
return hash & (n - 1);
}
return hash & (n - 1);
}
+/*
+ * Insert obj into the hash table hash, which has length size (which
+ * must be a power of 2). On collisions, simply overflow to the next
+ * empty bucket.
+ */
static void insert_obj_hash(struct object *obj, struct object **hash, unsigned int size)
{
unsigned int j = hash_obj(obj->sha1, size);
static void insert_obj_hash(struct object *obj, struct object **hash, unsigned int size)
{
unsigned int j = hash_obj(obj->sha1, size);
@@
-63,6
+81,10
@@
static void insert_obj_hash(struct object *obj, struct object **hash, unsigned i
hash[j] = obj;
}
hash[j] = obj;
}
+/*
+ * Look up the record for the given sha1 in the hash map stored in
+ * obj_hash. Return NULL if it was not found.
+ */
struct object *lookup_object(const unsigned char *sha1)
{
unsigned int i, first;
struct object *lookup_object(const unsigned char *sha1)
{
unsigned int i, first;
@@
-92,6
+114,11
@@
struct object *lookup_object(const unsigned char *sha1)
return obj;
}
return obj;
}
+/*
+ * Increase the size of the hash map stored in obj_hash to the next
+ * power of 2 (but at least 32). Copy the existing values to the new
+ * hash map.
+ */
static void grow_object_hash(void)
{
int i;
static void grow_object_hash(void)
{
int i;
diff --git
a/object.h
b/object.h
index dc5df8ce1d9579a28477f91300aa7a49f37ad4e4..732bf4d7e7012ce56045ec52404ac92b077305a6 100644
(file)
--- a/
object.h
+++ b/
object.h
@@
-42,7
+42,14
@@
struct object {
extern const char *typename(unsigned int type);
extern int type_from_string(const char *str);
extern const char *typename(unsigned int type);
extern int type_from_string(const char *str);
+/*
+ * Return the current number of buckets in the object hashmap.
+ */
extern unsigned int get_max_object_index(void);
extern unsigned int get_max_object_index(void);
+
+/*
+ * Return the object from the specified bucket in the object hashmap.
+ */
extern struct object *get_indexed_object(unsigned int);
/*
extern struct object *get_indexed_object(unsigned int);
/*