diff options
author | Ian Romanick <[email protected]> | 2018-11-21 13:45:52 -0800 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2018-12-16 14:39:56 -0800 |
commit | e3043e1276bfdf368a2ffa3580b5e05c33874041 (patch) | |
tree | 096b92c14ca44e8e0da15753951cc5deb2d946e5 /src/util | |
parent | db197fdb6c2de62ca84270cffea6a7e09b457f2b (diff) |
util/hash_table: Add _mesa_hash_table_init function
Signed-off-by: Ian Romanick <[email protected]>
Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/hash_table.c | 39 | ||||
-rw-r--r-- | 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, |