X-Git-Url: https://git.libre-soc.org/?p=mesa.git;a=blobdiff_plain;f=src%2Futil%2Fhash_table.c;h=57a5f247edcec89be20374b4dfbed320c9f36390;hp=fc152f84a4dde7d7a2c7d1229234d9bde2eef149;hb=ee23e8b17c77fa94320168427fb8a10a84b50e94;hpb=bb84fa146f2252f22999205a2904d8a948bffd3b diff --git a/src/util/hash_table.c b/src/util/hash_table.c index fc152f84a4d..57a5f247edc 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; @@ -534,6 +547,16 @@ _mesa_key_pointer_equal(const void *a, const void *b) return a == b; } +/** + * Helper to create a hash table with pointer keys. + */ +struct hash_table * +_mesa_pointer_hash_table_create(void *mem_ctx) +{ + return _mesa_hash_table_create(mem_ctx, _mesa_hash_pointer, + _mesa_key_pointer_equal); +} + /** * Hash table wrapper which supports 64-bit keys. *