From e3043e1276bfdf368a2ffa3580b5e05c33874041 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Wed, 21 Nov 2018 13:45:52 -0800 Subject: [PATCH] util/hash_table: Add _mesa_hash_table_init function Signed-off-by: Ian Romanick Reviewed-by: Jason Ekstrand --- src/util/hash_table.c | 39 ++++++++++++++++++++++++++------------- src/util/hash_table.h | 8 ++++++++ 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/util/hash_table.c b/src/util/hash_table.c index fc152f84a4d..4f510612a8f 100644 --- a/src/util/hash_table.c +++ b/src/util/hash_table.c @@ -110,6 +110,27 @@ entry_is_present(const struct hash_table *ht, struct hash_entry *entry) return entry->key != NULL && entry->key != ht->deleted_key; } +bool +_mesa_hash_table_init(struct hash_table *ht, + void *mem_ctx, + uint32_t (*key_hash_function)(const void *key), + bool (*key_equals_function)(const void *a, + const void *b)) +{ + ht->size_index = 0; + ht->size = hash_sizes[ht->size_index].size; + ht->rehash = hash_sizes[ht->size_index].rehash; + ht->max_entries = hash_sizes[ht->size_index].max_entries; + ht->key_hash_function = key_hash_function; + ht->key_equals_function = key_equals_function; + ht->table = rzalloc_array(mem_ctx, struct hash_entry, ht->size); + ht->entries = 0; + ht->deleted_entries = 0; + ht->deleted_key = &deleted_key_value; + + return ht->table != NULL; +} + struct hash_table * _mesa_hash_table_create(void *mem_ctx, uint32_t (*key_hash_function)(const void *key), @@ -118,22 +139,14 @@ _mesa_hash_table_create(void *mem_ctx, { struct hash_table *ht; + /* mem_ctx is used to allocate the hash table, but the hash table is used + * to allocate all of the suballocations. + */ ht = ralloc(mem_ctx, struct hash_table); if (ht == NULL) return NULL; - ht->size_index = 0; - ht->size = hash_sizes[ht->size_index].size; - ht->rehash = hash_sizes[ht->size_index].rehash; - ht->max_entries = hash_sizes[ht->size_index].max_entries; - ht->key_hash_function = key_hash_function; - ht->key_equals_function = key_equals_function; - ht->table = rzalloc_array(ht, struct hash_entry, ht->size); - ht->entries = 0; - ht->deleted_entries = 0; - ht->deleted_key = &deleted_key_value; - - if (ht->table == NULL) { + if (!_mesa_hash_table_init(ht, ht, key_hash_function, key_equals_function)) { ralloc_free(ht); return NULL; } @@ -287,7 +300,7 @@ _mesa_hash_table_rehash(struct hash_table *ht, unsigned new_size_index) if (new_size_index >= ARRAY_SIZE(hash_sizes)) return; - table = rzalloc_array(ht, struct hash_entry, + table = rzalloc_array(ralloc_parent(ht->table), struct hash_entry, hash_sizes[new_size_index].size); if (table == NULL) return; diff --git a/src/util/hash_table.h b/src/util/hash_table.h index d89fc1dc1c8..40acda1fd1e 100644 --- a/src/util/hash_table.h +++ b/src/util/hash_table.h @@ -62,6 +62,14 @@ _mesa_hash_table_create(void *mem_ctx, uint32_t (*key_hash_function)(const void *key), bool (*key_equals_function)(const void *a, const void *b)); + +bool +_mesa_hash_table_init(struct hash_table *ht, + void *mem_ctx, + uint32_t (*key_hash_function)(const void *key), + bool (*key_equals_function)(const void *a, + const void *b)); + struct hash_table * _mesa_hash_table_clone(struct hash_table *src, void *dst_mem_ctx); void _mesa_hash_table_destroy(struct hash_table *ht, -- 2.30.2