Re: [PATCH 6/6] Document some functions defined in object.c
- From
Nicolas Pitre <nico@fluxnic.net>
- Date
- Feb 21, 2014, 17:33 UTC
- Message-ID
- <alpine.LFD.2.11.1402211222270.17677@knanqh.ubzr>
- In-Reply-To
- <1393000327-11402-7-git-send-email-mhagger@alum.mit.edu>
On Fri, 21 Feb 2014, Michael Haggerty wrote:
> Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Minor nits below.
Show 19 quoted lines
> ---
> object.c | 23 ++++++++++++++++++++++-
> object.h | 7 +++++++
> 2 files changed, 29 insertions(+), 1 deletion(-)
>
> diff --git a/object.c b/object.c
> index 584f7ac..c34e225 100644
> --- a/object.c
> +++ b/object.c
> @@ -43,14 +43,26 @@ int type_from_string(const char *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.
> + *
> + * Since the sha1 is essentially random, we just take the required
> + * bits from the first sizeof(unsigned int) bytes of sha1.This might be improved a little. The only reason for the sizeof() is actually to copy those bits into a properly aligned integer. Some architectures have alignment restrictions that incure a significant cost when integer operations are performed on unaligned data whereas sha1 pointers don't have any particular alignment requirements. Once upon a time this used to simply be:
return *(unsigned int *)sha1 & (n - 1);
The memcpy is there only to avoid unaligned accesses.
Show 9 quoted lines
> + */
> static unsigned int hash_obj(const unsigned char *sha1, unsigned int n)
> {
> unsigned int hash;
> +
> memcpy(&hash, sha1, sizeof(unsigned int));
> - /* Assumes power-of-2 hash sizes in grow_object_hash */
> return hash & (n - 1);
> }Other than that...
Reviewed-by: Nicolas Pitre <nico@fluxnic.net>
Show 54 quoted lines
>
> +/*
> + * 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);
> @@ -63,6 +75,10 @@ static void insert_obj_hash(struct object *obj, struct object **hash, unsigned i
> 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;
> @@ -92,6 +108,11 @@ struct object *lookup_object(const unsigned char *sha1)
> 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;
> diff --git a/object.h b/object.h
> index dc5df8c..732bf4d 100644
> --- 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);
>
> +/*
> + * Return the current number of buckets in the object hashmap.
> + */
> 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);
>
> /*
> --
> 1.8.5.3
>