From 2afdd94f86149295f3e9422672c4501092f671d6 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Tue, 20 Oct 2020 14:37:10 -0700 Subject: [PATCH] util/set: Fix the _mesa_set_clear function to not leave tombstones. This implementation was broken and should have just been the same as the hash_table_clear() one, which I copied over here. It was setting all formerly-present entries to deleted, yet also setting deleted_entries to 0. This meant that all new searches or additions after clearing would have to reprobe the whole table until a rehash happened, and that rehash would be delayed because we violated the deleted_entries invariant. No statistically significant performance difference on softpipe KHR-GL33.texture_swizzle.functional runtime (n=18) Fixes: 5c075b085585 ("util/set: add a set_clear function") Reviewed-by: Jason Ekstrand Part-of: --- src/util/set.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/util/set.c b/src/util/set.c index 006d5d2a502..f10694537c1 100644 --- a/src/util/set.c +++ b/src/util/set.c @@ -223,13 +223,17 @@ _mesa_set_clear(struct set *set, void (*delete_function)(struct set_entry *entry if (!set) return; - set_foreach (set, entry) { - if (delete_function) + struct set_entry *entry; + + for (entry = set->table; entry != set->table + set->size; entry++) { + if (entry_is_present(entry) && delete_function != NULL) delete_function(entry); - entry->key = deleted_key; + + entry->key = NULL; } - set->entries = set->deleted_entries = 0; + set->entries = 0; + set->deleted_entries = 0; } /**