[Mesa-dev] [PATCH 06/15] mesa: Add hash_table_replace

Kenneth Graunke kenneth at whitecape.org
Thu Sep 29 14:18:51 PDT 2011


On 09/29/2011 10:51 AM, Ian Romanick wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
> 
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
>  src/mesa/program/hash_table.c |   25 +++++++++++++++++++++++++
>  src/mesa/program/hash_table.h |   15 +++++++++++++++
>  2 files changed, 40 insertions(+), 0 deletions(-)
> 
> diff --git a/src/mesa/program/hash_table.c b/src/mesa/program/hash_table.c
> index 2b09462..dc8563a 100644
> --- a/src/mesa/program/hash_table.c
> +++ b/src/mesa/program/hash_table.c
> @@ -150,6 +150,31 @@ hash_table_insert(struct hash_table *ht, void *data, const void *key)
>  }
>  
>  void
> +hash_table_replace(struct hash_table *ht, void *data, const void *key)
> +{
> +    const unsigned hash_value = (*ht->hash)(key);
> +    const unsigned bucket = hash_value % ht->num_buckets;
> +    struct node *node;
> +    struct hash_node *hn;
> +
> +    foreach(node, & ht->buckets[bucket]) {
> +       hn = (struct hash_node *) node;
> +
> +       if ((*ht->compare)(hn->key, key) == 0) {
> +	  hn->data = data;
> +	  return;
> +       }
> +    }

I'm pretty sure you mean:

   struct hash_node *hn = get_node(ht, key);

   if (hn != NULL) {
       hn->data = data;
       return;
   }

You just refactored that out in the previous patch to avoid doing things
like this.  Right?

> +
> +    hn = calloc(1, sizeof(*hn));
> +
> +    hn->data = data;
> +    hn->key = key;
> +
> +    insert_at_head(& ht->buckets[bucket], & hn->link);
> +}
> +
> +void
>  hash_table_remove(struct hash_table *ht, const void *key)
>  {
>     struct node *node = (struct node *) get_node(ht, key);
> diff --git a/src/mesa/program/hash_table.h b/src/mesa/program/hash_table.h
> index 746939c..e7ab067 100644
> --- a/src/mesa/program/hash_table.h
> +++ b/src/mesa/program/hash_table.h
> @@ -93,11 +93,26 @@ extern void *hash_table_find(struct hash_table *ht, const void *key);
>   * If \c key is already in the hash table, it will be added again.  Future
>   * calls to \c hash_table_find and \c hash_table_remove will return or remove,
>   * repsectively, the most recently added instance of \c key.
> + *
> + * \sa hash_table_replace
>   */
>  extern void hash_table_insert(struct hash_table *ht, void *data,
>      const void *key);
>  
>  /**
> + * Add an element to a hash table with replacement
> + *
> + * \warning
> + * If \c key is already in the hash table, \c data will \b replace the most
> + * recently inserted \c data (see the warning in \c hash_table_insert) for
> + * that key.
> + *
> + * \sa hash_table_insert
> + */
> +extern void hash_table_replace(struct hash_table *ht, void *data,
> +    const void *key);
> +
> +/**
>   * Remove a specific element from a hash table.
>   */
>  extern void hash_table_remove(struct hash_table *ht, const void *key);


More information about the mesa-dev mailing list