+void
+_mesa_HashRemove(struct _mesa_HashTable *table, GLuint key)
+{
+ _mesa_HashLockMutex(table);
+ _mesa_HashRemove_unlocked(table, key);
+ _mesa_HashUnlockMutex(table);
+}
+
+/**
+ * Delete all entries in a hash table, but don't delete the table itself.
+ * Invoke the given callback function for each table entry.
+ *
+ * \param table the hash table to delete
+ * \param callback the callback function
+ * \param userData arbitrary pointer to pass along to the callback
+ * (this is typically a struct gl_context pointer)
+ */
+void
+_mesa_HashDeleteAll(struct _mesa_HashTable *table,
+ void (*callback)(GLuint key, void *data, void *userData),
+ void *userData)
+{
+ struct hash_entry *entry;
+
+ assert(callback);
+ _mesa_HashLockMutex(table);
+ table->InDeleteAll = GL_TRUE;
+ hash_table_foreach(table->ht, entry) {
+ callback((uintptr_t)entry->key, entry->data, userData);
+ _mesa_hash_table_remove(table->ht, entry);
+ }
+ if (table->deleted_key_data) {
+ callback(DELETED_KEY_VALUE, table->deleted_key_data, userData);
+ table->deleted_key_data = NULL;
+ }
+ table->InDeleteAll = GL_FALSE;
+ _mesa_HashUnlockMutex(table);
+}