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