142f28684168ff88942f51fb01377702570d9d4d7José Fonseca/**************************************************************************
242f28684168ff88942f51fb01377702570d9d4d7José Fonseca *
342f28684168ff88942f51fb01377702570d9d4d7José Fonseca * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
442f28684168ff88942f51fb01377702570d9d4d7José Fonseca * All Rights Reserved.
542f28684168ff88942f51fb01377702570d9d4d7José Fonseca *
642f28684168ff88942f51fb01377702570d9d4d7José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
742f28684168ff88942f51fb01377702570d9d4d7José Fonseca * copy of this software and associated documentation files (the
842f28684168ff88942f51fb01377702570d9d4d7José Fonseca * "Software"), to deal in the Software without restriction, including
942f28684168ff88942f51fb01377702570d9d4d7José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
1042f28684168ff88942f51fb01377702570d9d4d7José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
1142f28684168ff88942f51fb01377702570d9d4d7José Fonseca * permit persons to whom the Software is furnished to do so, subject to
1242f28684168ff88942f51fb01377702570d9d4d7José Fonseca * the following conditions:
1342f28684168ff88942f51fb01377702570d9d4d7José Fonseca *
1442f28684168ff88942f51fb01377702570d9d4d7José Fonseca * The above copyright notice and this permission notice (including the
1542f28684168ff88942f51fb01377702570d9d4d7José Fonseca * next paragraph) shall be included in all copies or substantial portions
1642f28684168ff88942f51fb01377702570d9d4d7José Fonseca * of the Software.
1742f28684168ff88942f51fb01377702570d9d4d7José Fonseca *
1842f28684168ff88942f51fb01377702570d9d4d7José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1942f28684168ff88942f51fb01377702570d9d4d7José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2042f28684168ff88942f51fb01377702570d9d4d7José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2142f28684168ff88942f51fb01377702570d9d4d7José Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2242f28684168ff88942f51fb01377702570d9d4d7José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2342f28684168ff88942f51fb01377702570d9d4d7José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2442f28684168ff88942f51fb01377702570d9d4d7José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2542f28684168ff88942f51fb01377702570d9d4d7José Fonseca *
2642f28684168ff88942f51fb01377702570d9d4d7José Fonseca **************************************************************************/
2742f28684168ff88942f51fb01377702570d9d4d7José Fonseca
2842f28684168ff88942f51fb01377702570d9d4d7José Fonseca/**
2942f28684168ff88942f51fb01377702570d9d4d7José Fonseca * @file
3042f28684168ff88942f51fb01377702570d9d4d7José Fonseca * General purpose hash table implementation.
3142f28684168ff88942f51fb01377702570d9d4d7José Fonseca *
3242f28684168ff88942f51fb01377702570d9d4d7José Fonseca * Just uses the cso_hash for now, but it might be better switch to a linear
3342f28684168ff88942f51fb01377702570d9d4d7José Fonseca * probing hash table implementation at some point -- as it is said they have
3442f28684168ff88942f51fb01377702570d9d4d7José Fonseca * better lookup and cache performance and it appears to be possible to write
3542f28684168ff88942f51fb01377702570d9d4d7José Fonseca * a lock-free implementation of such hash tables .
3642f28684168ff88942f51fb01377702570d9d4d7José Fonseca *
3742f28684168ff88942f51fb01377702570d9d4d7José Fonseca * @author José Fonseca <jrfonseca@tungstengraphics.com>
3842f28684168ff88942f51fb01377702570d9d4d7José Fonseca */
3942f28684168ff88942f51fb01377702570d9d4d7José Fonseca
4042f28684168ff88942f51fb01377702570d9d4d7José Fonseca
4142f28684168ff88942f51fb01377702570d9d4d7José Fonseca#include "pipe/p_compiler.h"
42ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#include "util/u_debug.h"
4342f28684168ff88942f51fb01377702570d9d4d7José Fonseca
4442f28684168ff88942f51fb01377702570d9d4d7José Fonseca#include "cso_cache/cso_hash.h"
454f25420bdd834e81a3e22733304efc5261c2998aBrian Paul
464f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h"
474f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_hash_table.h"
4842f28684168ff88942f51fb01377702570d9d4d7José Fonseca
4942f28684168ff88942f51fb01377702570d9d4d7José Fonseca
505d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonsecastruct util_hash_table
5142f28684168ff88942f51fb01377702570d9d4d7José Fonseca{
5242f28684168ff88942f51fb01377702570d9d4d7José Fonseca   struct cso_hash *cso;
5342f28684168ff88942f51fb01377702570d9d4d7José Fonseca
5442f28684168ff88942f51fb01377702570d9d4d7José Fonseca   /** Hash function */
5542f28684168ff88942f51fb01377702570d9d4d7José Fonseca   unsigned (*hash)(void *key);
5642f28684168ff88942f51fb01377702570d9d4d7José Fonseca
5742f28684168ff88942f51fb01377702570d9d4d7José Fonseca   /** Compare two keys */
5842f28684168ff88942f51fb01377702570d9d4d7José Fonseca   int (*compare)(void *key1, void *key2);
5942f28684168ff88942f51fb01377702570d9d4d7José Fonseca
6042f28684168ff88942f51fb01377702570d9d4d7José Fonseca   /* TODO: key, value destructors? */
6142f28684168ff88942f51fb01377702570d9d4d7José Fonseca};
6242f28684168ff88942f51fb01377702570d9d4d7José Fonseca
6342f28684168ff88942f51fb01377702570d9d4d7José Fonseca
645d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonsecastruct util_hash_table_item
6542f28684168ff88942f51fb01377702570d9d4d7José Fonseca{
6642f28684168ff88942f51fb01377702570d9d4d7José Fonseca   void *key;
6742f28684168ff88942f51fb01377702570d9d4d7José Fonseca   void *value;
6842f28684168ff88942f51fb01377702570d9d4d7José Fonseca};
6942f28684168ff88942f51fb01377702570d9d4d7José Fonseca
7042f28684168ff88942f51fb01377702570d9d4d7José Fonseca
715d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonsecastatic INLINE struct util_hash_table_item *
725d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonsecautil_hash_table_item(struct cso_hash_iter iter)
73665b327a47ce80d136e91cfafedbc165227ea168José Fonseca{
745d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca   return (struct util_hash_table_item *)cso_hash_iter_data(iter);
75665b327a47ce80d136e91cfafedbc165227ea168José Fonseca}
76665b327a47ce80d136e91cfafedbc165227ea168José Fonseca
77665b327a47ce80d136e91cfafedbc165227ea168José Fonseca
785d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonsecastruct util_hash_table *
795d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonsecautil_hash_table_create(unsigned (*hash)(void *key),
805d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca                       int (*compare)(void *key1, void *key2))
8142f28684168ff88942f51fb01377702570d9d4d7José Fonseca{
825d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca   struct util_hash_table *ht;
8342f28684168ff88942f51fb01377702570d9d4d7José Fonseca
845d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca   ht = MALLOC_STRUCT(util_hash_table);
8542f28684168ff88942f51fb01377702570d9d4d7José Fonseca   if(!ht)
8642f28684168ff88942f51fb01377702570d9d4d7José Fonseca      return NULL;
8742f28684168ff88942f51fb01377702570d9d4d7José Fonseca
8842f28684168ff88942f51fb01377702570d9d4d7José Fonseca   ht->cso = cso_hash_create();
8942f28684168ff88942f51fb01377702570d9d4d7José Fonseca   if(!ht->cso) {
9042f28684168ff88942f51fb01377702570d9d4d7José Fonseca      FREE(ht);
9142f28684168ff88942f51fb01377702570d9d4d7José Fonseca      return NULL;
9242f28684168ff88942f51fb01377702570d9d4d7José Fonseca   }
9342f28684168ff88942f51fb01377702570d9d4d7José Fonseca
9442f28684168ff88942f51fb01377702570d9d4d7José Fonseca   ht->hash = hash;
9542f28684168ff88942f51fb01377702570d9d4d7José Fonseca   ht->compare = compare;
9642f28684168ff88942f51fb01377702570d9d4d7José Fonseca
9742f28684168ff88942f51fb01377702570d9d4d7José Fonseca   return ht;
9842f28684168ff88942f51fb01377702570d9d4d7José Fonseca}
9942f28684168ff88942f51fb01377702570d9d4d7José Fonseca
10042f28684168ff88942f51fb01377702570d9d4d7José Fonseca
101665b327a47ce80d136e91cfafedbc165227ea168José Fonsecastatic INLINE struct cso_hash_iter
1025d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonsecautil_hash_table_find_iter(struct util_hash_table *ht,
1035d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca                          void *key,
1045d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca                          unsigned key_hash)
105665b327a47ce80d136e91cfafedbc165227ea168José Fonseca{
106665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   struct cso_hash_iter iter;
1075d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca   struct util_hash_table_item *item;
108665b327a47ce80d136e91cfafedbc165227ea168José Fonseca
109665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   iter = cso_hash_find(ht->cso, key_hash);
110665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   while (!cso_hash_iter_is_null(iter)) {
1115d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca      item = (struct util_hash_table_item *)cso_hash_iter_data(iter);
112665b327a47ce80d136e91cfafedbc165227ea168José Fonseca      if (!ht->compare(item->key, key))
113665b327a47ce80d136e91cfafedbc165227ea168José Fonseca         break;
114665b327a47ce80d136e91cfafedbc165227ea168José Fonseca      iter = cso_hash_iter_next(iter);
115665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   }
116665b327a47ce80d136e91cfafedbc165227ea168José Fonseca
117665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   return iter;
118665b327a47ce80d136e91cfafedbc165227ea168José Fonseca}
119665b327a47ce80d136e91cfafedbc165227ea168José Fonseca
120665b327a47ce80d136e91cfafedbc165227ea168José Fonseca
1215d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonsecastatic INLINE struct util_hash_table_item *
1225d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonsecautil_hash_table_find_item(struct util_hash_table *ht,
1235d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca                          void *key,
1245d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca                          unsigned key_hash)
12542f28684168ff88942f51fb01377702570d9d4d7José Fonseca{
12642f28684168ff88942f51fb01377702570d9d4d7José Fonseca   struct cso_hash_iter iter;
1275d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca   struct util_hash_table_item *item;
12842f28684168ff88942f51fb01377702570d9d4d7José Fonseca
12942f28684168ff88942f51fb01377702570d9d4d7José Fonseca   iter = cso_hash_find(ht->cso, key_hash);
13042f28684168ff88942f51fb01377702570d9d4d7José Fonseca   while (!cso_hash_iter_is_null(iter)) {
1315d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca      item = (struct util_hash_table_item *)cso_hash_iter_data(iter);
13242f28684168ff88942f51fb01377702570d9d4d7José Fonseca      if (!ht->compare(item->key, key))
13342f28684168ff88942f51fb01377702570d9d4d7José Fonseca         return item;
13442f28684168ff88942f51fb01377702570d9d4d7José Fonseca      iter = cso_hash_iter_next(iter);
13542f28684168ff88942f51fb01377702570d9d4d7José Fonseca   }
13642f28684168ff88942f51fb01377702570d9d4d7José Fonseca
13742f28684168ff88942f51fb01377702570d9d4d7José Fonseca   return NULL;
13842f28684168ff88942f51fb01377702570d9d4d7José Fonseca}
13942f28684168ff88942f51fb01377702570d9d4d7José Fonseca
14042f28684168ff88942f51fb01377702570d9d4d7José Fonseca
14142f28684168ff88942f51fb01377702570d9d4d7José Fonsecaenum pipe_error
1425d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonsecautil_hash_table_set(struct util_hash_table *ht,
1435d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca                    void *key,
1445d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca                    void *value)
14542f28684168ff88942f51fb01377702570d9d4d7José Fonseca{
14642f28684168ff88942f51fb01377702570d9d4d7José Fonseca   unsigned key_hash;
1475d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca   struct util_hash_table_item *item;
148665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   struct cso_hash_iter iter;
14942f28684168ff88942f51fb01377702570d9d4d7José Fonseca
15042f28684168ff88942f51fb01377702570d9d4d7José Fonseca   assert(ht);
1514873031e29e0e8f654f78307e6ec885e68a54d86Zack Rusin   if (!ht)
1524873031e29e0e8f654f78307e6ec885e68a54d86Zack Rusin      return PIPE_ERROR_BAD_INPUT;
15342f28684168ff88942f51fb01377702570d9d4d7José Fonseca
15442f28684168ff88942f51fb01377702570d9d4d7José Fonseca   key_hash = ht->hash(key);
15542f28684168ff88942f51fb01377702570d9d4d7José Fonseca
1565d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca   item = util_hash_table_find_item(ht, key, key_hash);
15742f28684168ff88942f51fb01377702570d9d4d7José Fonseca   if(item) {
15842f28684168ff88942f51fb01377702570d9d4d7José Fonseca      /* TODO: key/value destruction? */
15942f28684168ff88942f51fb01377702570d9d4d7José Fonseca      item->value = value;
16042f28684168ff88942f51fb01377702570d9d4d7José Fonseca      return PIPE_OK;
16142f28684168ff88942f51fb01377702570d9d4d7José Fonseca   }
16242f28684168ff88942f51fb01377702570d9d4d7José Fonseca
1635d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca   item = MALLOC_STRUCT(util_hash_table_item);
16442f28684168ff88942f51fb01377702570d9d4d7José Fonseca   if(!item)
16542f28684168ff88942f51fb01377702570d9d4d7José Fonseca      return PIPE_ERROR_OUT_OF_MEMORY;
16642f28684168ff88942f51fb01377702570d9d4d7José Fonseca
16742f28684168ff88942f51fb01377702570d9d4d7José Fonseca   item->key = key;
16842f28684168ff88942f51fb01377702570d9d4d7José Fonseca   item->value = value;
16942f28684168ff88942f51fb01377702570d9d4d7José Fonseca
170665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   iter = cso_hash_insert(ht->cso, key_hash, item);
171665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   if(cso_hash_iter_is_null(iter)) {
17242f28684168ff88942f51fb01377702570d9d4d7José Fonseca      FREE(item);
17342f28684168ff88942f51fb01377702570d9d4d7José Fonseca      return PIPE_ERROR_OUT_OF_MEMORY;
17442f28684168ff88942f51fb01377702570d9d4d7José Fonseca   }
17542f28684168ff88942f51fb01377702570d9d4d7José Fonseca
17642f28684168ff88942f51fb01377702570d9d4d7José Fonseca   return PIPE_OK;
17742f28684168ff88942f51fb01377702570d9d4d7José Fonseca}
17842f28684168ff88942f51fb01377702570d9d4d7José Fonseca
17942f28684168ff88942f51fb01377702570d9d4d7José Fonseca
18042f28684168ff88942f51fb01377702570d9d4d7José Fonsecavoid *
1815d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonsecautil_hash_table_get(struct util_hash_table *ht,
1825d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca                    void *key)
18342f28684168ff88942f51fb01377702570d9d4d7José Fonseca{
18442f28684168ff88942f51fb01377702570d9d4d7José Fonseca   unsigned key_hash;
1855d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca   struct util_hash_table_item *item;
18642f28684168ff88942f51fb01377702570d9d4d7José Fonseca
18742f28684168ff88942f51fb01377702570d9d4d7José Fonseca   assert(ht);
1884873031e29e0e8f654f78307e6ec885e68a54d86Zack Rusin   if (!ht)
1894873031e29e0e8f654f78307e6ec885e68a54d86Zack Rusin      return NULL;
19042f28684168ff88942f51fb01377702570d9d4d7José Fonseca
19142f28684168ff88942f51fb01377702570d9d4d7José Fonseca   key_hash = ht->hash(key);
19242f28684168ff88942f51fb01377702570d9d4d7José Fonseca
1935d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca   item = util_hash_table_find_item(ht, key, key_hash);
19442f28684168ff88942f51fb01377702570d9d4d7José Fonseca   if(!item)
19542f28684168ff88942f51fb01377702570d9d4d7José Fonseca      return NULL;
19642f28684168ff88942f51fb01377702570d9d4d7José Fonseca
19742f28684168ff88942f51fb01377702570d9d4d7José Fonseca   return item->value;
19842f28684168ff88942f51fb01377702570d9d4d7José Fonseca}
19942f28684168ff88942f51fb01377702570d9d4d7José Fonseca
20042f28684168ff88942f51fb01377702570d9d4d7José Fonseca
20142f28684168ff88942f51fb01377702570d9d4d7José Fonsecavoid
2025d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonsecautil_hash_table_remove(struct util_hash_table *ht,
2035d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca                       void *key)
20442f28684168ff88942f51fb01377702570d9d4d7José Fonseca{
20542f28684168ff88942f51fb01377702570d9d4d7José Fonseca   unsigned key_hash;
206665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   struct cso_hash_iter iter;
2075d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca   struct util_hash_table_item *item;
20842f28684168ff88942f51fb01377702570d9d4d7José Fonseca
20942f28684168ff88942f51fb01377702570d9d4d7José Fonseca   assert(ht);
2104873031e29e0e8f654f78307e6ec885e68a54d86Zack Rusin   if (!ht)
2114873031e29e0e8f654f78307e6ec885e68a54d86Zack Rusin      return;
21242f28684168ff88942f51fb01377702570d9d4d7José Fonseca
21342f28684168ff88942f51fb01377702570d9d4d7José Fonseca   key_hash = ht->hash(key);
21442f28684168ff88942f51fb01377702570d9d4d7José Fonseca
2155d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca   iter = util_hash_table_find_iter(ht, key, key_hash);
216665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   if(cso_hash_iter_is_null(iter))
21742f28684168ff88942f51fb01377702570d9d4d7José Fonseca      return;
21842f28684168ff88942f51fb01377702570d9d4d7José Fonseca
2195d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca   item = util_hash_table_item(iter);
220665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   assert(item);
221665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   FREE(item);
222665b327a47ce80d136e91cfafedbc165227ea168José Fonseca
223665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   cso_hash_erase(ht->cso, iter);
224665b327a47ce80d136e91cfafedbc165227ea168José Fonseca}
225665b327a47ce80d136e91cfafedbc165227ea168José Fonseca
226665b327a47ce80d136e91cfafedbc165227ea168José Fonseca
227665b327a47ce80d136e91cfafedbc165227ea168José Fonsecavoid
2285d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonsecautil_hash_table_clear(struct util_hash_table *ht)
229665b327a47ce80d136e91cfafedbc165227ea168José Fonseca{
230665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   struct cso_hash_iter iter;
2315d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca   struct util_hash_table_item *item;
232665b327a47ce80d136e91cfafedbc165227ea168José Fonseca
233665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   assert(ht);
2344873031e29e0e8f654f78307e6ec885e68a54d86Zack Rusin   if (!ht)
2354873031e29e0e8f654f78307e6ec885e68a54d86Zack Rusin      return;
2364873031e29e0e8f654f78307e6ec885e68a54d86Zack Rusin
237665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   iter = cso_hash_first_node(ht->cso);
238665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   while (!cso_hash_iter_is_null(iter)) {
2395d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca      item = (struct util_hash_table_item *)cso_hash_take(ht->cso, cso_hash_iter_key(iter));
240665b327a47ce80d136e91cfafedbc165227ea168José Fonseca      FREE(item);
241665b327a47ce80d136e91cfafedbc165227ea168José Fonseca      iter = cso_hash_first_node(ht->cso);
242665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   }
24342f28684168ff88942f51fb01377702570d9d4d7José Fonseca}
24442f28684168ff88942f51fb01377702570d9d4d7José Fonseca
24542f28684168ff88942f51fb01377702570d9d4d7José Fonseca
246d26139d6a19aaf8b4dbbaa1ee937fed2283923e4José Fonsecaenum pipe_error
2475d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonsecautil_hash_table_foreach(struct util_hash_table *ht,
2483924d8611513eea74446d655b554596ab66381ffCorbin Simpson                     enum pipe_error (*callback)
2493924d8611513eea74446d655b554596ab66381ffCorbin Simpson                        (void *key, void *value, void *data),
2503924d8611513eea74446d655b554596ab66381ffCorbin Simpson                     void *data)
251d26139d6a19aaf8b4dbbaa1ee937fed2283923e4José Fonseca{
252d26139d6a19aaf8b4dbbaa1ee937fed2283923e4José Fonseca   struct cso_hash_iter iter;
2535d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca   struct util_hash_table_item *item;
254d26139d6a19aaf8b4dbbaa1ee937fed2283923e4José Fonseca   enum pipe_error result;
2554873031e29e0e8f654f78307e6ec885e68a54d86Zack Rusin
256665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   assert(ht);
2574873031e29e0e8f654f78307e6ec885e68a54d86Zack Rusin   if (!ht)
2584873031e29e0e8f654f78307e6ec885e68a54d86Zack Rusin      return PIPE_ERROR_BAD_INPUT;
2594873031e29e0e8f654f78307e6ec885e68a54d86Zack Rusin
260d26139d6a19aaf8b4dbbaa1ee937fed2283923e4José Fonseca   iter = cso_hash_first_node(ht->cso);
261d26139d6a19aaf8b4dbbaa1ee937fed2283923e4José Fonseca   while (!cso_hash_iter_is_null(iter)) {
2625d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca      item = (struct util_hash_table_item *)cso_hash_iter_data(iter);
263d26139d6a19aaf8b4dbbaa1ee937fed2283923e4José Fonseca      result = callback(item->key, item->value, data);
264d26139d6a19aaf8b4dbbaa1ee937fed2283923e4José Fonseca      if(result != PIPE_OK)
265d26139d6a19aaf8b4dbbaa1ee937fed2283923e4José Fonseca	 return result;
266d26139d6a19aaf8b4dbbaa1ee937fed2283923e4José Fonseca      iter = cso_hash_iter_next(iter);
267d26139d6a19aaf8b4dbbaa1ee937fed2283923e4José Fonseca   }
268d26139d6a19aaf8b4dbbaa1ee937fed2283923e4José Fonseca
269d26139d6a19aaf8b4dbbaa1ee937fed2283923e4José Fonseca   return PIPE_OK;
270d26139d6a19aaf8b4dbbaa1ee937fed2283923e4José Fonseca}
271d26139d6a19aaf8b4dbbaa1ee937fed2283923e4José Fonseca
272d26139d6a19aaf8b4dbbaa1ee937fed2283923e4José Fonseca
27342f28684168ff88942f51fb01377702570d9d4d7José Fonsecavoid
2745d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonsecautil_hash_table_destroy(struct util_hash_table *ht)
27542f28684168ff88942f51fb01377702570d9d4d7José Fonseca{
276665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   struct cso_hash_iter iter;
2775d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca   struct util_hash_table_item *item;
2784873031e29e0e8f654f78307e6ec885e68a54d86Zack Rusin
27942f28684168ff88942f51fb01377702570d9d4d7José Fonseca   assert(ht);
2804873031e29e0e8f654f78307e6ec885e68a54d86Zack Rusin   if (!ht)
2814873031e29e0e8f654f78307e6ec885e68a54d86Zack Rusin      return;
2824873031e29e0e8f654f78307e6ec885e68a54d86Zack Rusin
283665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   iter = cso_hash_first_node(ht->cso);
284665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   while (!cso_hash_iter_is_null(iter)) {
2855d42e3988de8b3e1b37d8c21d18db240bc8b4096José Fonseca      item = (struct util_hash_table_item *)cso_hash_iter_data(iter);
286665b327a47ce80d136e91cfafedbc165227ea168José Fonseca      FREE(item);
287665b327a47ce80d136e91cfafedbc165227ea168José Fonseca      iter = cso_hash_iter_next(iter);
288665b327a47ce80d136e91cfafedbc165227ea168José Fonseca   }
28942f28684168ff88942f51fb01377702570d9d4d7José Fonseca
29042f28684168ff88942f51fb01377702570d9d4d7José Fonseca   cso_hash_delete(ht->cso);
29142f28684168ff88942f51fb01377702570d9d4d7José Fonseca
29242f28684168ff88942f51fb01377702570d9d4d7José Fonseca   FREE(ht);
29342f28684168ff88942f51fb01377702570d9d4d7José Fonseca}
294