[Mesa-dev] [PATCH 11/14] util: Implement returning the last added entry on search
Thomas Helland
thomashelland90 at gmail.com
Sun Jan 1 18:37:55 UTC 2017
---
src/util/non_replacing_hash_table.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/src/util/non_replacing_hash_table.c b/src/util/non_replacing_hash_table.c
index 1128388ab8..48f42aa7c9 100644
--- a/src/util/non_replacing_hash_table.c
+++ b/src/util/non_replacing_hash_table.c
@@ -222,7 +222,23 @@ hash_table_search(struct hash_table *ht, uint32_t hash, const void *key)
return NULL;
} else if (entry_is_present(ht, entry) && entry->hash == hash) {
if (ht->key_equals_function(key, entry->key)) {
- return entry;
+ struct hash_entry *previous_entry = entry;
+
+ /* Follow the chain of matching key's to the end */
+ while (previous_entry->next_data != 0 ) {
+ entry = ht->table + previous_entry->next_data;
+ /* We might have deleted the last entry, and have a
+ * dangling reference, so check that the keys match
+ * before we continue on traversing through the chain.
+ * If the key's don't match we return the previous entry.
+ */
+ if (!ht->key_equals_function(key, entry->key))
+ return previous_entry;
+
+ previous_entry = entry;
+ }
+
+ return previous_entry;
}
}
--
2.11.0
More information about the mesa-dev
mailing list