util/hash_table: add function for reserving size in a hash table
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Tue, 6 Oct 2020 20:30:47 +0000 (16:30 -0400)
committerMarge Bot <eric+marge@anholt.net>
Thu, 8 Oct 2020 18:21:48 +0000 (18:21 +0000)
rehashing a populated hash table is very expensive, so for the case where
the maximum/likely table size is already known, this function allows for
pre-sizing the table to avoid ever needing a rehash

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7037>

src/util/hash_table.c
src/util/hash_table.h

index 7b2b7eb..596bab4 100644 (file)
@@ -660,6 +660,21 @@ _mesa_pointer_hash_table_create(void *mem_ctx)
                                   _mesa_key_pointer_equal);
 }
 
+
+bool
+_mesa_hash_table_reserve(struct hash_table *ht, unsigned size)
+{
+   if (size < ht->max_entries)
+      return true;
+   for (unsigned i = ht->size_index + 1; i < ARRAY_SIZE(hash_sizes); i++) {
+      if (hash_sizes[i].max_entries >= size) {
+         _mesa_hash_table_rehash(ht, i);
+         break;
+      }
+   }
+   return ht->max_entries >= size;
+}
+
 /**
  * Hash table wrapper which supports 64-bit keys.
  *
index eabc88a..d59e33f 100644 (file)
@@ -124,6 +124,8 @@ bool _mesa_key_pointer_equal(const void *a, const void *b);
 struct hash_table *
 _mesa_pointer_hash_table_create(void *mem_ctx);
 
+bool
+_mesa_hash_table_reserve(struct hash_table *ht, unsigned size);
 /**
  * This foreach function is safe against deletion (which just replaces
  * an entry's data with the deleted marker), but not against insertion