util: Detect use-after-destroy in simple_mtx
[mesa.git] / src / util / hash_table.c
index 58104abd739e44f1e0f74fab7f9b806d9ad9e0d0..58e6fc2d91691a3cafb07b0201cb1771db6478d8 100644 (file)
@@ -655,8 +655,8 @@ _mesa_hash_table_u64_create(void *mem_ctx)
 }
 
 void
-_mesa_hash_table_u64_destroy(struct hash_table_u64 *ht,
-                             void (*delete_function)(struct hash_entry *entry))
+_mesa_hash_table_u64_clear(struct hash_table_u64 *ht,
+                           void (*delete_function)(struct hash_entry *entry))
 {
    if (!ht)
       return;
@@ -667,7 +667,12 @@ _mesa_hash_table_u64_destroy(struct hash_table_u64 *ht,
          struct hash_entry entry;
 
          /* Create a fake entry for the delete function. */
-         entry.hash = table->key_hash_function(table->deleted_key);
+         if (sizeof(void *) == 8) {
+            entry.hash = table->key_hash_function(table->deleted_key);
+         } else {
+            struct hash_key_u64 _key = { .value = (uintptr_t)table->deleted_key };
+            entry.hash = table->key_hash_function(&_key);
+         }
          entry.key = table->deleted_key;
          entry.data = ht->deleted_key_data;
 
@@ -682,7 +687,12 @@ _mesa_hash_table_u64_destroy(struct hash_table_u64 *ht,
          struct hash_entry entry;
 
          /* Create a fake entry for the delete function. */
-         entry.hash = table->key_hash_function(uint_key(FREED_KEY_VALUE));
+         if (sizeof(void *) == 8) {
+            entry.hash = table->key_hash_function(uint_key(FREED_KEY_VALUE));
+         } else {
+            struct hash_key_u64 _key = { .value = (uintptr_t)FREED_KEY_VALUE };
+            entry.hash = table->key_hash_function(&_key);
+         }
          entry.key = uint_key(FREED_KEY_VALUE);
          entry.data = ht->freed_key_data;
 
@@ -691,6 +701,17 @@ _mesa_hash_table_u64_destroy(struct hash_table_u64 *ht,
       ht->freed_key_data = NULL;
    }
 
+   _mesa_hash_table_clear(ht->table, delete_function);
+}
+
+void
+_mesa_hash_table_u64_destroy(struct hash_table_u64 *ht,
+                             void (*delete_function)(struct hash_entry *entry))
+{
+   if (!ht)
+      return;
+
+   _mesa_hash_table_u64_clear(ht, delete_function);
    _mesa_hash_table_destroy(ht->table, delete_function);
    free(ht);
 }