[Mesa-dev] [PATCH] util/hash_table: Rework the API to know about hashing

Jason Ekstrand jason at jlekstrand.net
Mon Nov 24 22:20:29 PST 2014


If people like this change, I'll do the same thing to the hash set
implementation.
--Jason

On Mon, Nov 24, 2014 at 10:19 PM, Jason Ekstrand <jason at jlekstrand.net>
wrote:

> Previously, the hash_table API required the user to do all of the hashing
> of keys as it passed them in.  Since the hashing function is intrinsicly
> tied to the comparison function, it makes sense for the hash table to know
> about it.  Also, it makes for a somewhat clumsy API as the user is
> constantly calling hashing functions many of which have long names.  This
> is especially bad when the standard call looks something like
>
> _mesa_hash_table_insert(ht, _mesa_pointer_hash(key), key, data);
>
> In the above case, there is no reason why the hash table shouldn't do the
> hashing for you.  We leave the option for you to do your own hashing if
> it's more efficient, but it's no longer needed.  Also, if you do do your
> own hashing, the hash table will assert that your hash matches what it
> expects out of the hashing function.  This should make it harder to mess up
> your hashing.
>
> Signed-off-by: Jason Ekstrand <jason.ekstrand at intel.com>
> ---
>  src/gallium/drivers/vc4/vc4_opt_cse.c          |  7 +--
>  src/glsl/ir_variable_refcount.cpp              |  9 ++--
>  src/glsl/link_uniform_block_active_visitor.cpp |  6 +--
>  src/glsl/link_uniform_blocks.cpp               |  3 +-
>  src/mesa/main/hash.c                           | 17 ++++--
>  src/util/hash_table.c                          | 75
> +++++++++++++++++++-------
>  src/util/hash_table.h                          | 19 +++++--
>  src/util/tests/hash_table/collision.c          | 22 ++++----
>  src/util/tests/hash_table/delete_and_lookup.c  | 16 +++---
>  src/util/tests/hash_table/delete_management.c  |  9 ++--
>  src/util/tests/hash_table/destroy_callback.c   |  9 ++--
>  src/util/tests/hash_table/insert_and_lookup.c  | 13 +++--
>  src/util/tests/hash_table/insert_many.c        |  6 +--
>  src/util/tests/hash_table/random_entry.c       |  4 +-
>  src/util/tests/hash_table/remove_null.c        |  2 +-
>  src/util/tests/hash_table/replacement.c        | 13 +++--
>  16 files changed, 138 insertions(+), 92 deletions(-)
>
> diff --git a/src/gallium/drivers/vc4/vc4_opt_cse.c
> b/src/gallium/drivers/vc4/vc4_opt_cse.c
> index bebfb652..0e9335e 100644
> --- a/src/gallium/drivers/vc4/vc4_opt_cse.c
> +++ b/src/gallium/drivers/vc4/vc4_opt_cse.c
> @@ -84,7 +84,7 @@ vc4_find_cse(struct vc4_compile *c, struct hash_table
> *ht,
>
>          uint32_t hash = _mesa_hash_data(&key, sizeof(key));
>          struct hash_entry *entry =
> -                _mesa_hash_table_search(ht, hash, &key);
> +                _mesa_hash_table_search_with_hash(ht, hash, &key);
>
>          if (entry) {
>                  if (debug) {
> @@ -106,7 +106,7 @@ vc4_find_cse(struct vc4_compile *c, struct hash_table
> *ht,
>          if (!alloc_key)
>                  return NULL;
>          memcpy(alloc_key, &key, sizeof(*alloc_key));
> -        _mesa_hash_table_insert(ht, hash, alloc_key, inst);
> +        _mesa_hash_table_insert_with_hash(ht, hash, alloc_key, inst);
>
>          if (debug) {
>                  fprintf(stderr, "Added to CSE HT: ");
> @@ -125,7 +125,8 @@ qir_opt_cse(struct vc4_compile *c)
>          struct qinst *last_sf = NULL;
>          uint32_t sf_count = 0, r4_count = 0;
>
> -        struct hash_table *ht = _mesa_hash_table_create(NULL,
> inst_key_equals);
> +        struct hash_table *ht = _mesa_hash_table_create(NULL, NULL,
> +                                                        inst_key_equals);
>          if (!ht)
>                  return false;
>
> diff --git a/src/glsl/ir_variable_refcount.cpp
> b/src/glsl/ir_variable_refcount.cpp
> index f67fe67..e4d825c 100644
> --- a/src/glsl/ir_variable_refcount.cpp
> +++ b/src/glsl/ir_variable_refcount.cpp
> @@ -38,7 +38,8 @@
>  ir_variable_refcount_visitor::ir_variable_refcount_visitor()
>  {
>     this->mem_ctx = ralloc_context(NULL);
> -   this->ht = _mesa_hash_table_create(NULL, _mesa_key_pointer_equal);
> +   this->ht = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
> +                                      _mesa_key_pointer_equal);
>  }
>
>  static void
> @@ -70,15 +71,13 @@
> ir_variable_refcount_visitor::get_variable_entry(ir_variable *var)
>  {
>     assert(var);
>
> -   struct hash_entry *e = _mesa_hash_table_search(this->ht,
> -
>  _mesa_hash_pointer(var),
> -                                                   var);
> +   struct hash_entry *e = _mesa_hash_table_search(this->ht, var);
>     if (e)
>        return (ir_variable_refcount_entry *)e->data;
>
>     ir_variable_refcount_entry *entry = new
> ir_variable_refcount_entry(var);
>     assert(entry->referenced_count == 0);
> -   _mesa_hash_table_insert(this->ht, _mesa_hash_pointer(var), var, entry);
> +   _mesa_hash_table_insert(this->ht, var, entry);
>
>     return entry;
>  }
> diff --git a/src/glsl/link_uniform_block_active_visitor.cpp
> b/src/glsl/link_uniform_block_active_visitor.cpp
> index 9da6a4b..292cde3 100644
> --- a/src/glsl/link_uniform_block_active_visitor.cpp
> +++ b/src/glsl/link_uniform_block_active_visitor.cpp
> @@ -27,9 +27,8 @@
>  link_uniform_block_active *
>  process_block(void *mem_ctx, struct hash_table *ht, ir_variable *var)
>  {
> -   const uint32_t h = _mesa_hash_string(var->get_interface_type()->name);
>     const hash_entry *const existing_block =
> -      _mesa_hash_table_search(ht, h, var->get_interface_type()->name);
> +      _mesa_hash_table_search(ht, var->get_interface_type()->name);
>
>     const glsl_type *const block_type = var->is_interface_instance()
>        ? var->type : var->get_interface_type();
> @@ -54,8 +53,7 @@ process_block(void *mem_ctx, struct hash_table *ht,
> ir_variable *var)
>           b->binding = 0;
>        }
>
> -      _mesa_hash_table_insert(ht, h, var->get_interface_type()->name,
> -                             (void *) b);
> +      _mesa_hash_table_insert(ht, var->get_interface_type()->name, (void
> *) b);
>        return b;
>     } else {
>        link_uniform_block_active *const b =
> diff --git a/src/glsl/link_uniform_blocks.cpp
> b/src/glsl/link_uniform_blocks.cpp
> index 536fcd4..f5fc502 100644
> --- a/src/glsl/link_uniform_blocks.cpp
> +++ b/src/glsl/link_uniform_blocks.cpp
> @@ -182,7 +182,8 @@ link_uniform_blocks(void *mem_ctx,
>      * the hash is organized by block-name.
>      */
>     struct hash_table *block_hash =
> -      _mesa_hash_table_create(mem_ctx, _mesa_key_string_equal);
> +      _mesa_hash_table_create(mem_ctx, _mesa_key_hash_string,
> +                              _mesa_key_string_equal);
>
>     if (block_hash == NULL) {
>        _mesa_error_no_memory(__func__);
> diff --git a/src/mesa/main/hash.c b/src/mesa/main/hash.c
> index 52095f7..a73d4a3 100644
> --- a/src/mesa/main/hash.c
> +++ b/src/mesa/main/hash.c
> @@ -96,6 +96,12 @@ uint_hash(GLuint id)
>     return id;
>  }
>
> +static uint32_t
> +uint_key_hash(const void *key)
> +{
> +   return uint_hash((uintptr_t)key);
> +}
> +
>  static void *
>  uint_key(GLuint id)
>  {
> @@ -114,7 +120,8 @@ _mesa_NewHashTable(void)
>     struct _mesa_HashTable *table = CALLOC_STRUCT(_mesa_HashTable);
>
>     if (table) {
> -      table->ht = _mesa_hash_table_create(NULL, uint_key_compare);
> +      table->ht = _mesa_hash_table_create(NULL, uint_key_hash,
> +                                          uint_key_compare);
>        if (table->ht == NULL) {
>           free(table);
>           _mesa_error_no_memory(__func__);
> @@ -175,7 +182,7 @@ _mesa_HashLookup_unlocked(struct _mesa_HashTable
> *table, GLuint key)
>     if (key == DELETED_KEY_VALUE)
>        return table->deleted_key_data;
>
> -   entry = _mesa_hash_table_search(table->ht, uint_hash(key),
> uint_key(key));
> +   entry = _mesa_hash_table_search(table->ht, uint_key(key));
>     if (!entry)
>        return NULL;
>
> @@ -266,11 +273,11 @@ _mesa_HashInsert_unlocked(struct _mesa_HashTable
> *table, GLuint key, void *data)
>     if (key == DELETED_KEY_VALUE) {
>        table->deleted_key_data = data;
>     } else {
> -      entry = _mesa_hash_table_search(table->ht, hash, uint_key(key));
> +      entry = _mesa_hash_table_search_with_hash(table->ht, hash,
> uint_key(key));
>        if (entry) {
>           entry->data = data;
>        } else {
> -         _mesa_hash_table_insert(table->ht, hash, uint_key(key), data);
> +         _mesa_hash_table_insert_with_hash(table->ht, hash,
> uint_key(key), data);
>        }
>     }
>  }
> @@ -340,7 +347,7 @@ _mesa_HashRemove(struct _mesa_HashTable *table, GLuint
> key)
>     if (key == DELETED_KEY_VALUE) {
>        table->deleted_key_data = NULL;
>     } else {
> -      entry = _mesa_hash_table_search(table->ht, uint_hash(key),
> uint_key(key));
> +      entry = _mesa_hash_table_search(table->ht, uint_key(key));
>        _mesa_hash_table_remove(table->ht, entry);
>     }
>     mtx_unlock(&table->Mutex);
> diff --git a/src/util/hash_table.c b/src/util/hash_table.c
> index 1b6726c..8eb96f9 100644
> --- a/src/util/hash_table.c
> +++ b/src/util/hash_table.c
> @@ -42,6 +42,7 @@
>
>  #include <stdlib.h>
>  #include <string.h>
> +#include <assert.h>
>
>  #include "hash_table.h"
>  #include "ralloc.h"
> @@ -110,6 +111,7 @@ entry_is_present(const struct hash_table *ht, struct
> hash_entry *entry)
>
>  struct hash_table *
>  _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))
>  {
> @@ -123,6 +125,7 @@ _mesa_hash_table_create(void *mem_ctx,
>     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;
> @@ -176,15 +179,8 @@ _mesa_hash_table_set_deleted_key(struct hash_table
> *ht, const void *deleted_key)
>     ht->deleted_key = deleted_key;
>  }
>
> -/**
> - * Finds a hash table entry with the given key and hash of that key.
> - *
> - * Returns NULL if no entry is found.  Note that the data pointer may be
> - * modified by the user.
> - */
> -struct hash_entry *
> -_mesa_hash_table_search(struct hash_table *ht, uint32_t hash,
> -                        const void *key)
> +static struct hash_entry *
> +hash_table_search(struct hash_table *ht, uint32_t hash, const void *key)
>  {
>     uint32_t start_hash_address = hash % ht->size;
>     uint32_t hash_address = start_hash_address;
> @@ -210,6 +206,31 @@ _mesa_hash_table_search(struct hash_table *ht,
> uint32_t hash,
>     return NULL;
>  }
>
> +/**
> + * Finds a hash table entry with the given key and hash of that key.
> + *
> + * Returns NULL if no entry is found.  Note that the data pointer may be
> + * modified by the user.
> + */
> +struct hash_entry *
> +_mesa_hash_table_search(struct hash_table *ht, const void *key)
> +{
> +   assert(ht->key_hash_function);
> +   return hash_table_search(ht, ht->key_hash_function(key), key);
> +}
> +
> +struct hash_entry *
> +_mesa_hash_table_search_with_hash(struct hash_table *ht, uint32_t hash,
> +                                  const void *key)
> +{
> +   assert(ht->key_hash_function == NULL || hash ==
> ht->key_hash_function(key));
> +   return hash_table_search(ht, hash, key);
> +}
> +
> +static struct hash_entry *
> +hash_table_insert(struct hash_table *ht, uint32_t hash,
> +                  const void *key, void *data);
> +
>  static void
>  _mesa_hash_table_rehash(struct hash_table *ht, int new_size_index)
>  {
> @@ -235,22 +256,15 @@ _mesa_hash_table_rehash(struct hash_table *ht, int
> new_size_index)
>     ht->deleted_entries = 0;
>
>     hash_table_foreach(&old_ht, entry) {
> -      _mesa_hash_table_insert(ht, entry->hash,
> -                              entry->key, entry->data);
> +      hash_table_insert(ht, entry->hash, entry->key, entry->data);
>     }
>
>     ralloc_free(old_ht.table);
>  }
>
> -/**
> - * Inserts the key with the given hash into the table.
> - *
> - * Note that insertion may rearrange the table on a resize or rehash,
> - * so previously found hash_entries are no longer valid after this
> function.
> - */
> -struct hash_entry *
> -_mesa_hash_table_insert(struct hash_table *ht, uint32_t hash,
> -                        const void *key, void *data)
> +static struct hash_entry *
> +hash_table_insert(struct hash_table *ht, uint32_t hash,
> +                  const void *key, void *data)
>  {
>     uint32_t start_hash_address, hash_address;
>
> @@ -307,6 +321,27 @@ _mesa_hash_table_insert(struct hash_table *ht,
> uint32_t hash,
>  }
>
>  /**
> + * Inserts the key with the given hash into the table.
> + *
> + * Note that insertion may rearrange the table on a resize or rehash,
> + * so previously found hash_entries are no longer valid after this
> function.
> + */
> +struct hash_entry *
> +_mesa_hash_table_insert(struct hash_table *ht, const void *key, void
> *data)
> +{
> +   assert(ht->key_hash_function);
> +   hash_table_insert(ht, ht->key_hash_function(key), key, data);
> +}
> +
> +struct hash_entry *
> +_mesa_hash_table_insert_with_hash(struct hash_table *ht, uint32_t hash,
> +                                  const void *key, void *data)
> +{
> +   assert(ht->key_hash_function == NULL || hash ==
> ht->key_hash_function(key));
> +   hash_table_insert(ht, hash, key, data);
> +}
> +
> +/**
>   * This function deletes the given hash table entry.
>   *
>   * Note that deletion doesn't otherwise modify the table, so an iteration
> over
> diff --git a/src/util/hash_table.h b/src/util/hash_table.h
> index d6b6ebf..a65127f 100644
> --- a/src/util/hash_table.h
> +++ b/src/util/hash_table.h
> @@ -46,6 +46,7 @@ struct hash_entry {
>
>  struct hash_table {
>     struct hash_entry *table;
> +   uint32_t (*key_hash_function)(const void *key);
>     bool (*key_equals_function)(const void *a, const void *b);
>     const void *deleted_key;
>     uint32_t size;
> @@ -58,6 +59,7 @@ struct hash_table {
>
>  struct hash_table *
>  _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));
>  void _mesa_hash_table_destroy(struct hash_table *ht,
> @@ -66,11 +68,15 @@ void _mesa_hash_table_set_deleted_key(struct
> hash_table *ht,
>                                        const void *deleted_key);
>
>  struct hash_entry *
> -_mesa_hash_table_insert(struct hash_table *ht, uint32_t hash,
> -                        const void *key, void *data);
> +_mesa_hash_table_insert(struct hash_table *ht, const void *key, void
> *data);
>  struct hash_entry *
> -_mesa_hash_table_search(struct hash_table *ht, uint32_t hash,
> -                        const void *key);
> +_mesa_hash_table_insert_with_hash(struct hash_table *ht, uint32_t hash,
> +                                  const void *key, void *data);
> +struct hash_entry *
> +_mesa_hash_table_search(struct hash_table *ht, const void *key);
> +struct hash_entry *
> +_mesa_hash_table_search_with_hash(struct hash_table *ht, uint32_t hash,
> +                                  const void *key);
>  void _mesa_hash_table_remove(struct hash_table *ht,
>                               struct hash_entry *entry);
>
> @@ -85,6 +91,11 @@ uint32_t _mesa_hash_string(const char *key);
>  bool _mesa_key_string_equal(const void *a, const void *b);
>  bool _mesa_key_pointer_equal(const void *a, const void *b);
>
> +static inline uint32_t _mesa_key_hash_string(const void *key)
> +{
> +   return _mesa_hash_string((const char *)key);
> +}
> +
>  static inline uint32_t _mesa_hash_pointer(const void *pointer)
>  {
>     return _mesa_hash_data(&pointer, sizeof(pointer));
> diff --git a/src/util/tests/hash_table/collision.c
> b/src/util/tests/hash_table/collision.c
> index 9174c39..e73c233 100644
> --- a/src/util/tests/hash_table/collision.c
> +++ b/src/util/tests/hash_table/collision.c
> @@ -40,38 +40,38 @@ main(int argc, char **argv)
>     uint32_t bad_hash = 5;
>     int i;
>
> -   ht = _mesa_hash_table_create(NULL, _mesa_key_string_equal);
> +   ht = _mesa_hash_table_create(NULL, NULL, _mesa_key_string_equal);
>
> -   _mesa_hash_table_insert(ht, bad_hash, str1, NULL);
> -   _mesa_hash_table_insert(ht, bad_hash, str2, NULL);
> +   _mesa_hash_table_insert_with_hash(ht, bad_hash, str1, NULL);
> +   _mesa_hash_table_insert_with_hash(ht, bad_hash, str2, NULL);
>
> -   entry1 = _mesa_hash_table_search(ht, bad_hash, str1);
> +   entry1 = _mesa_hash_table_search_with_hash(ht, bad_hash, str1);
>     assert(entry1->key == str1);
>
> -   entry2 = _mesa_hash_table_search(ht, bad_hash, str2);
> +   entry2 = _mesa_hash_table_search_with_hash(ht, bad_hash, str2);
>     assert(entry2->key == str2);
>
>     /* Check that we can still find #1 after inserting #2 */
> -   entry1 = _mesa_hash_table_search(ht, bad_hash, str1);
> +   entry1 = _mesa_hash_table_search_with_hash(ht, bad_hash, str1);
>     assert(entry1->key == str1);
>
>     /* Remove the collided entry and look again. */
>     _mesa_hash_table_remove(ht, entry1);
> -   entry2 = _mesa_hash_table_search(ht, bad_hash, str2);
> +   entry2 = _mesa_hash_table_search_with_hash(ht, bad_hash, str2);
>     assert(entry2->key == str2);
>
>     /* Put str1 back, then spam junk into the table to force a
>      * resize and make sure we can still find them both.
>      */
> -   _mesa_hash_table_insert(ht, bad_hash, str1, NULL);
> +   _mesa_hash_table_insert_with_hash(ht, bad_hash, str1, NULL);
>     for (i = 0; i < 100; i++) {
>        char *key = malloc(10);
>        sprintf(key, "spam%d", i);
> -      _mesa_hash_table_insert(ht, _mesa_hash_string(key), key, NULL);
> +      _mesa_hash_table_insert_with_hash(ht, _mesa_hash_string(key), key,
> NULL);
>     }
> -   entry1 = _mesa_hash_table_search(ht, bad_hash, str1);
> +   entry1 = _mesa_hash_table_search_with_hash(ht, bad_hash, str1);
>     assert(entry1->key == str1);
> -   entry2 = _mesa_hash_table_search(ht, bad_hash, str2);
> +   entry2 = _mesa_hash_table_search_with_hash(ht, bad_hash, str2);
>     assert(entry2->key == str2);
>
>     _mesa_hash_table_destroy(ht, NULL);
> diff --git a/src/util/tests/hash_table/delete_and_lookup.c
> b/src/util/tests/hash_table/delete_and_lookup.c
> index fc886ff..be54631 100644
> --- a/src/util/tests/hash_table/delete_and_lookup.c
> +++ b/src/util/tests/hash_table/delete_and_lookup.c
> @@ -45,27 +45,25 @@ main(int argc, char **argv)
>         struct hash_table *ht;
>         const char *str1 = "test1";
>         const char *str2 = "test2";
> -       uint32_t hash_str1 = badhash(str1);
> -       uint32_t hash_str2 = badhash(str2);
>         struct hash_entry *entry;
>
> -       ht = _mesa_hash_table_create(NULL, _mesa_key_string_equal);
> +       ht = _mesa_hash_table_create(NULL, badhash,
> _mesa_key_string_equal);
>
> -       _mesa_hash_table_insert(ht, hash_str1, str1, NULL);
> -       _mesa_hash_table_insert(ht, hash_str2, str2, NULL);
> +       _mesa_hash_table_insert(ht, str1, NULL);
> +       _mesa_hash_table_insert(ht, str2, NULL);
>
> -       entry = _mesa_hash_table_search(ht, hash_str2, str2);
> +       entry = _mesa_hash_table_search(ht, str2);
>         assert(strcmp(entry->key, str2) == 0);
>
> -       entry = _mesa_hash_table_search(ht, hash_str1, str1);
> +       entry = _mesa_hash_table_search(ht, str1);
>         assert(strcmp(entry->key, str1) == 0);
>
>         _mesa_hash_table_remove(ht, entry);
>
> -       entry = _mesa_hash_table_search(ht, hash_str1, str1);
> +       entry = _mesa_hash_table_search(ht, str1);
>         assert(entry == NULL);
>
> -       entry = _mesa_hash_table_search(ht, hash_str2, str2);
> +       entry = _mesa_hash_table_search(ht, str2);
>         assert(strcmp(entry->key, str2) == 0);
>
>         _mesa_hash_table_destroy(ht, NULL);
> diff --git a/src/util/tests/hash_table/delete_management.c
> b/src/util/tests/hash_table/delete_management.c
> index b8d7640..0a6bec3 100644
> --- a/src/util/tests/hash_table/delete_management.c
> +++ b/src/util/tests/hash_table/delete_management.c
> @@ -51,24 +51,23 @@ main(int argc, char **argv)
>     uint32_t keys[size];
>     uint32_t i;
>
> -   ht = _mesa_hash_table_create(NULL, uint32_t_key_equals);
> +   ht = _mesa_hash_table_create(NULL, key_value, uint32_t_key_equals);
>
>     for (i = 0; i < size; i++) {
>        keys[i] = i;
>
> -      _mesa_hash_table_insert(ht, i, keys + i, NULL);
> +      _mesa_hash_table_insert(ht, keys + i, NULL);
>
>        if (i >= 100) {
>           uint32_t delete_value = i - 100;
> -         entry = _mesa_hash_table_search(ht, delete_value,
> -                                              &delete_value);
> +         entry = _mesa_hash_table_search(ht, &delete_value);
>           _mesa_hash_table_remove(ht, entry);
>        }
>     }
>
>     /* Make sure that all our entries were present at the end. */
>     for (i = size - 100; i < size; i++) {
> -      entry = _mesa_hash_table_search(ht, i, keys + i);
> +      entry = _mesa_hash_table_search(ht, keys + i);
>        assert(entry);
>        assert(key_value(entry->key) == i);
>     }
> diff --git a/src/util/tests/hash_table/destroy_callback.c
> b/src/util/tests/hash_table/destroy_callback.c
> index dce2b33..79b4fda 100644
> --- a/src/util/tests/hash_table/destroy_callback.c
> +++ b/src/util/tests/hash_table/destroy_callback.c
> @@ -50,13 +50,12 @@ int
>  main(int argc, char **argv)
>  {
>     struct hash_table *ht;
> -   uint32_t hash_str1 = _mesa_hash_string(str1);
> -   uint32_t hash_str2 = _mesa_hash_string(str2);
>
> -   ht = _mesa_hash_table_create(NULL, _mesa_key_string_equal);
> +   ht = _mesa_hash_table_create(NULL, _mesa_key_hash_string,
> +                                _mesa_key_string_equal);
>
> -   _mesa_hash_table_insert(ht, hash_str1, str1, NULL);
> -   _mesa_hash_table_insert(ht, hash_str2, str2, NULL);
> +   _mesa_hash_table_insert(ht, str1, NULL);
> +   _mesa_hash_table_insert(ht, str2, NULL);
>
>     _mesa_hash_table_destroy(ht, delete_callback);
>
> diff --git a/src/util/tests/hash_table/insert_and_lookup.c
> b/src/util/tests/hash_table/insert_and_lookup.c
> index 402f3fd..0705b07 100644
> --- a/src/util/tests/hash_table/insert_and_lookup.c
> +++ b/src/util/tests/hash_table/insert_and_lookup.c
> @@ -36,19 +36,18 @@ main(int argc, char **argv)
>     struct hash_table *ht;
>     const char *str1 = "test1";
>     const char *str2 = "test2";
> -   uint32_t hash_str1 = _mesa_hash_string(str1);
> -   uint32_t hash_str2 = _mesa_hash_string(str2);
>     struct hash_entry *entry;
>
> -   ht = _mesa_hash_table_create(NULL, _mesa_key_string_equal);
> +   ht = _mesa_hash_table_create(NULL, _mesa_key_hash_string,
> +                                _mesa_key_string_equal);
>
> -   _mesa_hash_table_insert(ht, hash_str1, str1, NULL);
> -   _mesa_hash_table_insert(ht, hash_str2, str2, NULL);
> +   _mesa_hash_table_insert(ht, str1, NULL);
> +   _mesa_hash_table_insert(ht, str2, NULL);
>
> -   entry = _mesa_hash_table_search(ht, hash_str1, str1);
> +   entry = _mesa_hash_table_search(ht, str1);
>     assert(strcmp(entry->key, str1) == 0);
>
> -   entry = _mesa_hash_table_search(ht, hash_str2, str2);
> +   entry = _mesa_hash_table_search(ht, str2);
>     assert(strcmp(entry->key, str2) == 0);
>
>     _mesa_hash_table_destroy(ht, NULL);
> diff --git a/src/util/tests/hash_table/insert_many.c
> b/src/util/tests/hash_table/insert_many.c
> index b2122dc..c6c0591 100644
> --- a/src/util/tests/hash_table/insert_many.c
> +++ b/src/util/tests/hash_table/insert_many.c
> @@ -51,16 +51,16 @@ main(int argc, char **argv)
>     uint32_t keys[size];
>     uint32_t i;
>
> -   ht = _mesa_hash_table_create(NULL, uint32_t_key_equals);
> +   ht = _mesa_hash_table_create(NULL, key_value, uint32_t_key_equals);
>
>     for (i = 0; i < size; i++) {
>        keys[i] = i;
>
> -      _mesa_hash_table_insert(ht, i, keys + i, NULL);
> +      _mesa_hash_table_insert(ht, keys + i, NULL);
>     }
>
>     for (i = 0; i < size; i++) {
> -      entry = _mesa_hash_table_search(ht, i, keys + i);
> +      entry = _mesa_hash_table_search(ht, keys + i);
>        assert(entry);
>        assert(key_value(entry->key) == i);
>     }
> diff --git a/src/util/tests/hash_table/random_entry.c
> b/src/util/tests/hash_table/random_entry.c
> index 22cafa7..4a79181 100644
> --- a/src/util/tests/hash_table/random_entry.c
> +++ b/src/util/tests/hash_table/random_entry.c
> @@ -57,12 +57,12 @@ main(int argc, char **argv)
>     uint32_t keys[size];
>     uint32_t i, random_value;
>
> -   ht = _mesa_hash_table_create(NULL, uint32_t_key_equals);
> +   ht = _mesa_hash_table_create(NULL, key_value, uint32_t_key_equals);
>
>     for (i = 0; i < size; i++) {
>        keys[i] = i;
>
> -      _mesa_hash_table_insert(ht, i, keys + i, NULL);
> +      _mesa_hash_table_insert(ht, keys + i, NULL);
>     }
>
>     /* Test the no-predicate case. */
> diff --git a/src/util/tests/hash_table/remove_null.c
> b/src/util/tests/hash_table/remove_null.c
> index 90fb784..7042f5e 100644
> --- a/src/util/tests/hash_table/remove_null.c
> +++ b/src/util/tests/hash_table/remove_null.c
> @@ -35,7 +35,7 @@ main(int argc, char **argv)
>  {
>     struct hash_table *ht;
>
> -   ht = _mesa_hash_table_create(NULL, _mesa_key_string_equal);
> +   ht = _mesa_hash_table_create(NULL, NULL, _mesa_key_string_equal);
>
>     _mesa_hash_table_remove(ht, NULL);
>
> diff --git a/src/util/tests/hash_table/replacement.c
> b/src/util/tests/hash_table/replacement.c
> index 387cfc0..01ede68 100644
> --- a/src/util/tests/hash_table/replacement.c
> +++ b/src/util/tests/hash_table/replacement.c
> @@ -36,24 +36,23 @@ main(int argc, char **argv)
>     struct hash_table *ht;
>     char *str1 = strdup("test1");
>     char *str2 = strdup("test1");
> -   uint32_t hash_str1 = _mesa_hash_string(str1);
> -   uint32_t hash_str2 = _mesa_hash_string(str2);
>     struct hash_entry *entry;
>
>     assert(str1 != str2);
>
> -   ht = _mesa_hash_table_create(NULL, _mesa_key_string_equal);
> +   ht = _mesa_hash_table_create(NULL, _mesa_key_hash_string,
> +                                _mesa_key_string_equal);
>
> -   _mesa_hash_table_insert(ht, hash_str1, str1, str1);
> -   _mesa_hash_table_insert(ht, hash_str2, str2, str2);
> +   _mesa_hash_table_insert(ht, str1, str1);
> +   _mesa_hash_table_insert(ht, str2, str2);
>
> -   entry = _mesa_hash_table_search(ht, hash_str1, str1);
> +   entry = _mesa_hash_table_search(ht, str1);
>     assert(entry);
>     assert(entry->data == str2);
>
>     _mesa_hash_table_remove(ht, entry);
>
> -   entry = _mesa_hash_table_search(ht, hash_str1, str1);
> +   entry = _mesa_hash_table_search(ht, str1);
>     assert(!entry);
>
>     _mesa_hash_table_destroy(ht, NULL);
> --
> 2.1.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20141124/3f798ffe/attachment-0001.html>


More information about the mesa-dev mailing list