summaryrefslogtreecommitdiff
path: root/hashmap.c
diff options
context:
space:
mode:
authorJeff Hostetler <jeffhost@microsoft.com>2017-03-22 17:14:22 (GMT)
committerJunio C Hamano <gitster@pobox.com>2017-03-22 20:41:41 (GMT)
commit0607e10009ee4e37cb49b4cec8d28a9dda1656a4 (patch)
tree1c4faeee2a69a761d2a6257fa2741750dec43723 /hashmap.c
parentf75619bd6d21760e1da416d4e27bce6468beffcd (diff)
downloadgit-0607e10009ee4e37cb49b4cec8d28a9dda1656a4.zip
git-0607e10009ee4e37cb49b4cec8d28a9dda1656a4.tar.gz
git-0607e10009ee4e37cb49b4cec8d28a9dda1656a4.tar.bz2
hashmap: add disallow_rehash setting
Teach hashmap to allow rehashes to be suppressed. This is useful when hashmaps are accessed by multiple threads. It still requires the caller to properly manage their locking. This just prevents unexpected rehashing during inserts and deletes. Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'hashmap.c')
-rw-r--r--hashmap.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/hashmap.c b/hashmap.c
index 93793cb..7d1044e 100644
--- a/hashmap.c
+++ b/hashmap.c
@@ -104,11 +104,19 @@ static inline unsigned int bucket(const struct hashmap *map,
return key->hash & (map->tablesize - 1);
}
+int hashmap_bucket(const struct hashmap *map, unsigned int hash)
+{
+ return hash & (map->tablesize - 1);
+}
+
static void rehash(struct hashmap *map, unsigned int newsize)
{
unsigned int i, oldsize = map->tablesize;
struct hashmap_entry **oldtable = map->table;
+ if (map->disallow_rehash)
+ return;
+
alloc_table(map, newsize);
for (i = 0; i < oldsize; i++) {
struct hashmap_entry *e = oldtable[i];
@@ -141,7 +149,9 @@ void hashmap_init(struct hashmap *map, hashmap_cmp_fn equals_function,
size_t initial_size)
{
unsigned int size = HASHMAP_INITIAL_SIZE;
- map->size = 0;
+
+ memset(map, 0, sizeof(*map));
+
map->cmpfn = equals_function ? equals_function : always_equal;
/* calculate initial table size and allocate the table */