mesa: fold _mesa_HashDeleteAll into _mesa_DeleteHashTable

They are always called back-to-back. This is simpler.

Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27586>
This commit is contained in:
Marek Olšák 2024-02-06 02:12:22 -05:00 committed by Marge Bot
parent d33bffd708
commit 8ca750a8b6
10 changed files with 73 additions and 116 deletions

View file

@ -233,7 +233,7 @@ _mesa_glthread_init(struct gl_context *ctx)
ctx->MarshalExec = _mesa_alloc_dispatch_table(true);
if (!ctx->MarshalExec) {
_mesa_DeleteHashTable(glthread->VAOs);
_mesa_DeleteHashTable(glthread->VAOs, NULL, NULL);
util_queue_destroy(&glthread->queue);
return;
}
@ -289,8 +289,7 @@ _mesa_glthread_destroy(struct gl_context *ctx)
for (unsigned i = 0; i < MARSHAL_MAX_BATCHES; i++)
util_queue_fence_destroy(&glthread->batches[i].fence);
_mesa_HashDeleteAll(glthread->VAOs, free_vao, NULL);
_mesa_DeleteHashTable(glthread->VAOs);
_mesa_DeleteHashTable(glthread->VAOs, free_vao, NULL);
_mesa_glthread_release_upload_buffer(ctx);
}
}

View file

@ -134,11 +134,35 @@ _mesa_NewHashTable(void)
* Note that the caller should have already traversed the table and deleted
* the objects in the table (i.e. We don't free the entries' data pointer).
*
* Invoke the given callback function for each table entry if not NULL.
*
* \param table the hash table to delete.
* \param table the hash table to delete
* \param free_callback the callback function
* \param userData arbitrary pointer to pass along to the callback
* (this is typically a struct gl_context pointer)
*/
void
_mesa_DeleteHashTable(struct _mesa_HashTable *table)
_mesa_DeleteHashTable(struct _mesa_HashTable *table,
void (*free_callback)(void *data, void *userData),
void *userData)
{
if (free_callback) {
#ifndef NDEBUG
table->InDeleteAll = GL_TRUE;
#endif
hash_table_foreach(table->ht, entry) {
free_callback(entry->data, userData);
_mesa_hash_table_remove(table->ht, entry);
}
if (table->deleted_key_data) {
free_callback(table->deleted_key_data, userData);
}
#ifndef NDEBUG
table->InDeleteAll = GL_FALSE;
#endif
}
if (_mesa_hash_table_next_entry(table->ht, NULL) != NULL) {
_mesa_problem(NULL, "In _mesa_DeleteHashTable, found non-freed data");
}
@ -292,7 +316,7 @@ _mesa_HashRemoveLocked(struct _mesa_HashTable *table, GLuint key)
assert(key);
#ifndef NDEBUG
/* assert if _mesa_HashRemove illegally called from _mesa_HashDeleteAll
/* assert if _mesa_HashRemove illegally called from _mesa_DeleteHashTable
* callback function. Have to check this outside of mutex lock.
*/
assert(!table->InDeleteAll);
@ -319,45 +343,6 @@ _mesa_HashRemove(struct _mesa_HashTable *table, GLuint 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)(void *data, void *userData),
void *userData)
{
assert(callback);
_mesa_HashLockMutex(table);
#ifndef NDEBUG
table->InDeleteAll = GL_TRUE;
#endif
hash_table_foreach(table->ht, entry) {
callback(entry->data, userData);
_mesa_hash_table_remove(table->ht, entry);
}
if (table->deleted_key_data) {
callback(table->deleted_key_data, userData);
table->deleted_key_data = NULL;
}
if (table->id_alloc) {
util_idalloc_fini(table->id_alloc);
free(table->id_alloc);
init_name_reuse(table);
}
#ifndef NDEBUG
table->InDeleteAll = GL_FALSE;
#endif
table->MaxKey = 0;
_mesa_HashUnlockMutex(table);
}
/**
* Walk over all entries in a hash table, calling callback function for each.
* \param table the hash table to walk

View file

@ -60,7 +60,9 @@ struct _mesa_HashTable *
_mesa_NewHashTable(void);
void
_mesa_DeleteHashTable(struct _mesa_HashTable *table);
_mesa_DeleteHashTable(struct _mesa_HashTable *table,
void (*free_callback)(void *data, void *userData),
void *userData);
void *
_mesa_HashLookup(struct _mesa_HashTable *table, GLuint key);
@ -82,11 +84,6 @@ _mesa_HashInsertLocked(struct _mesa_HashTable *table,
void
_mesa_HashRemoveLocked(struct _mesa_HashTable *table, GLuint key);
void
_mesa_HashDeleteAll(struct _mesa_HashTable *table,
void (*callback)(void *data, void *userData),
void *userData);
void
_mesa_HashWalk(struct _mesa_HashTable *table,
void (*callback)(void *data, void *userData),

View file

@ -496,9 +496,8 @@ free_performance_monitor(void *data, void *user)
void
_mesa_free_performance_monitors(struct gl_context *ctx)
{
_mesa_HashDeleteAll(ctx->PerfMonitor.Monitors,
free_performance_monitor, ctx);
_mesa_DeleteHashTable(ctx->PerfMonitor.Monitors);
_mesa_DeleteHashTable(ctx->PerfMonitor.Monitors, free_performance_monitor,
ctx);
}
static inline struct gl_perf_monitor_object *

View file

@ -65,9 +65,7 @@ free_performance_query(void *data, void *user)
void
_mesa_free_performance_queries(struct gl_context *ctx)
{
_mesa_HashDeleteAll(ctx->PerfQuery.Objects,
free_performance_query, ctx);
_mesa_DeleteHashTable(ctx->PerfQuery.Objects);
_mesa_DeleteHashTable(ctx->PerfQuery.Objects, free_performance_query, ctx);
}
static inline struct gl_perf_query_object *

View file

@ -105,7 +105,7 @@ _mesa_init_pipeline(struct gl_context *ctx)
/**
* Callback for deleting a pipeline object. Called by _mesa_HashDeleteAll().
* Callback for deleting a pipeline object. Called by _mesa_DeleteHashTable().
*/
static void
delete_pipelineobj_cb(void *data, void *userData)
@ -123,10 +123,7 @@ void
_mesa_free_pipeline_data(struct gl_context *ctx)
{
_mesa_reference_pipeline_object(ctx, &ctx->_Shader, NULL);
_mesa_HashDeleteAll(ctx->Pipeline.Objects, delete_pipelineobj_cb, ctx);
_mesa_DeleteHashTable(ctx->Pipeline.Objects);
_mesa_DeleteHashTable(ctx->Pipeline.Objects, delete_pipelineobj_cb, ctx);
_mesa_delete_pipeline_object(ctx, ctx->Pipeline.Default);
}

View file

@ -1385,7 +1385,7 @@ _mesa_init_queryobj(struct gl_context *ctx)
/**
* Callback for deleting a query object. Called by _mesa_HashDeleteAll().
* Callback for deleting a query object. Called by _mesa_DeleteHashTable().
*/
static void
delete_queryobj_cb(void *data, void *userData)
@ -1402,6 +1402,5 @@ delete_queryobj_cb(void *data, void *userData)
void
_mesa_free_queryobj_data(struct gl_context *ctx)
{
_mesa_HashDeleteAll(ctx->Query.QueryObjects, delete_queryobj_cb, ctx);
_mesa_DeleteHashTable(ctx->Query.QueryObjects);
_mesa_DeleteHashTable(ctx->Query.QueryObjects, delete_queryobj_cb, ctx);
}

View file

@ -148,7 +148,7 @@ _mesa_alloc_shared_state(struct gl_context *ctx)
/**
* Callback for deleting a display list. Called by _mesa_HashDeleteAll().
* Callback for deleting a display list. Called by _mesa_DeleteHashTable().
*/
static void
delete_displaylist_cb(void *data, void *userData)
@ -160,7 +160,7 @@ delete_displaylist_cb(void *data, void *userData)
/**
* Callback for deleting a texture object. Called by _mesa_HashDeleteAll().
* Callback for deleting a texture object. Called by _mesa_DeleteHashTable().
*/
static void
delete_texture_cb(void *data, void *userData)
@ -172,7 +172,7 @@ delete_texture_cb(void *data, void *userData)
/**
* Callback for deleting a program object. Called by _mesa_HashDeleteAll().
* Callback for deleting a program object. Called by _mesa_DeleteHashTable().
*/
static void
delete_program_cb(void *data, void *userData)
@ -189,7 +189,7 @@ delete_program_cb(void *data, void *userData)
/**
* Callback for deleting an ATI fragment shader object.
* Called by _mesa_HashDeleteAll().
* Called by _mesa_DeleteHashTable().
*/
static void
delete_fragshader_cb(void *data, void *userData)
@ -201,7 +201,7 @@ delete_fragshader_cb(void *data, void *userData)
/**
* Callback for deleting a buffer object. Called by _mesa_HashDeleteAll().
* Callback for deleting a buffer object. Called by _mesa_DeleteHashTable().
*/
static void
delete_bufferobj_cb(void *data, void *userData)
@ -232,7 +232,7 @@ free_shader_program_data_cb(void *data, void *userData)
/**
* Callback for deleting shader and shader programs objects.
* Called by _mesa_HashDeleteAll().
* Called by _mesa_DeleteHashTable().
*/
static void
delete_shader_cb(void *data, void *userData)
@ -251,7 +251,7 @@ delete_shader_cb(void *data, void *userData)
/**
* Callback for deleting a framebuffer object. Called by _mesa_HashDeleteAll()
* Callback for deleting a framebuffer object. Called by _mesa_DeleteHashTable()
*/
static void
delete_framebuffer_cb(void *data, UNUSED void *userData)
@ -272,7 +272,7 @@ delete_framebuffer_cb(void *data, UNUSED void *userData)
/**
* Callback for deleting a renderbuffer object. Called by _mesa_HashDeleteAll()
* Callback for deleting a renderbuffer object. Called by _mesa_DeleteHashTable()
*/
static void
delete_renderbuffer_cb(void *data, void *userData)
@ -286,7 +286,7 @@ delete_renderbuffer_cb(void *data, void *userData)
/**
* Callback for deleting a sampler object. Called by _mesa_HashDeleteAll()
* Callback for deleting a sampler object. Called by _mesa_DeleteHashTable()
*/
static void
delete_sampler_object_cb(void *data, void *userData)
@ -297,7 +297,7 @@ delete_sampler_object_cb(void *data, void *userData)
}
/**
* Callback for deleting a memory object. Called by _mesa_HashDeleteAll().
* Callback for deleting a memory object. Called by _mesa_DeleteHashTable().
*/
static void
delete_memory_object_cb(void *data, void *userData)
@ -308,7 +308,7 @@ delete_memory_object_cb(void *data, void *userData)
}
/**
* Callback for deleting a memory object. Called by _mesa_HashDeleteAll().
* Callback for deleting a memory object. Called by _mesa_DeleteHashTable().
*/
static void
delete_semaphore_object_cb(void *data, void *userData)
@ -347,22 +347,18 @@ free_shared_state(struct gl_context *ctx, struct gl_shared_state *shared)
* Free display lists
*/
if (shared->DisplayList) {
_mesa_HashDeleteAll(shared->DisplayList, delete_displaylist_cb, ctx);
_mesa_DeleteHashTable(shared->DisplayList);
_mesa_DeleteHashTable(shared->DisplayList, delete_displaylist_cb, ctx);
free(shared->small_dlist_store.ptr);
util_idalloc_fini(&shared->small_dlist_store.free_idx);
}
if (shared->ShaderObjects) {
_mesa_HashWalk(shared->ShaderObjects, free_shader_program_data_cb, ctx);
_mesa_HashDeleteAll(shared->ShaderObjects, delete_shader_cb, ctx);
_mesa_DeleteHashTable(shared->ShaderObjects);
_mesa_DeleteHashTable(shared->ShaderObjects, delete_shader_cb, ctx);
}
if (shared->Programs) {
_mesa_HashDeleteAll(shared->Programs, delete_program_cb, ctx);
_mesa_DeleteHashTable(shared->Programs);
}
if (shared->Programs)
_mesa_DeleteHashTable(shared->Programs, delete_program_cb, ctx);
if (shared->DefaultVertexProgram)
_mesa_reference_program(ctx, &shared->DefaultVertexProgram, NULL);
@ -373,15 +369,11 @@ free_shared_state(struct gl_context *ctx, struct gl_shared_state *shared)
if (shared->DefaultFragmentShader)
_mesa_delete_ati_fragment_shader(ctx, shared->DefaultFragmentShader);
if (shared->ATIShaders) {
_mesa_HashDeleteAll(shared->ATIShaders, delete_fragshader_cb, ctx);
_mesa_DeleteHashTable(shared->ATIShaders);
}
if (shared->ATIShaders)
_mesa_DeleteHashTable(shared->ATIShaders, delete_fragshader_cb, ctx);
if (shared->BufferObjects) {
_mesa_HashDeleteAll(shared->BufferObjects, delete_bufferobj_cb, ctx);
_mesa_DeleteHashTable(shared->BufferObjects);
}
if (shared->BufferObjects)
_mesa_DeleteHashTable(shared->BufferObjects, delete_bufferobj_cb, ctx);
if (shared->ZombieBufferObjects) {
set_foreach(shared->ZombieBufferObjects, entry) {
@ -390,15 +382,11 @@ free_shared_state(struct gl_context *ctx, struct gl_shared_state *shared)
_mesa_set_destroy(shared->ZombieBufferObjects, NULL);
}
if (shared->FrameBuffers) {
_mesa_HashDeleteAll(shared->FrameBuffers, delete_framebuffer_cb, ctx);
_mesa_DeleteHashTable(shared->FrameBuffers);
}
if (shared->FrameBuffers)
_mesa_DeleteHashTable(shared->FrameBuffers, delete_framebuffer_cb, ctx);
if (shared->RenderBuffers) {
_mesa_HashDeleteAll(shared->RenderBuffers, delete_renderbuffer_cb, ctx);
_mesa_DeleteHashTable(shared->RenderBuffers);
}
if (shared->RenderBuffers)
_mesa_DeleteHashTable(shared->RenderBuffers, delete_renderbuffer_cb, ctx);
if (shared->SyncObjects) {
set_foreach(shared->SyncObjects, entry) {
@ -409,9 +397,8 @@ free_shared_state(struct gl_context *ctx, struct gl_shared_state *shared)
}
if (shared->SamplerObjects) {
_mesa_HashDeleteAll(shared->SamplerObjects, delete_sampler_object_cb,
ctx);
_mesa_DeleteHashTable(shared->SamplerObjects);
_mesa_DeleteHashTable(shared->SamplerObjects, delete_sampler_object_cb,
ctx);
}
/*
@ -425,10 +412,8 @@ free_shared_state(struct gl_context *ctx, struct gl_shared_state *shared)
}
/* all other textures */
if (shared->TexObjects) {
_mesa_HashDeleteAll(shared->TexObjects, delete_texture_cb, ctx);
_mesa_DeleteHashTable(shared->TexObjects);
}
if (shared->TexObjects)
_mesa_DeleteHashTable(shared->TexObjects, delete_texture_cb, ctx);
_mesa_free_shared_handles(shared);
@ -437,13 +422,13 @@ free_shared_state(struct gl_context *ctx, struct gl_shared_state *shared)
simple_mtx_destroy(&shared->ShaderIncludeMutex);
if (shared->MemoryObjects) {
_mesa_HashDeleteAll(shared->MemoryObjects, delete_memory_object_cb, ctx);
_mesa_DeleteHashTable(shared->MemoryObjects);
_mesa_DeleteHashTable(shared->MemoryObjects, delete_memory_object_cb,
ctx);
}
if (shared->SemaphoreObjects) {
_mesa_HashDeleteAll(shared->SemaphoreObjects, delete_semaphore_object_cb, ctx);
_mesa_DeleteHashTable(shared->SemaphoreObjects);
_mesa_DeleteHashTable(shared->SemaphoreObjects,
delete_semaphore_object_cb, ctx);
}
simple_mtx_destroy(&shared->Mutex);

View file

@ -191,7 +191,7 @@ _mesa_init_transform_feedback(struct gl_context *ctx)
/**
* Callback for _mesa_HashDeleteAll().
* Callback for _mesa_DeleteHashTable().
*/
static void
delete_cb(void *data, void *userData)
@ -216,8 +216,7 @@ _mesa_free_transform_feedback(struct gl_context *ctx)
NULL);
/* Delete all feedback objects */
_mesa_HashDeleteAll(ctx->TransformFeedback.Objects, delete_cb, ctx);
_mesa_DeleteHashTable(ctx->TransformFeedback.Objects);
_mesa_DeleteHashTable(ctx->TransformFeedback.Objects, delete_cb, ctx);
/* Delete the default feedback object */
delete_transform_feedback(ctx,

View file

@ -4172,7 +4172,7 @@ _mesa_init_varray(struct gl_context *ctx)
/**
* Callback for deleting an array object. Called by _mesa_HashDeleteAll().
* Callback for deleting an array object. Called by _mesa_DeleteHashTable().
*/
static void
delete_arrayobj_cb(void *data, void *userData)
@ -4189,8 +4189,7 @@ delete_arrayobj_cb(void *data, void *userData)
void
_mesa_free_varray_data(struct gl_context *ctx)
{
_mesa_HashDeleteAll(ctx->Array.Objects, delete_arrayobj_cb, ctx);
_mesa_DeleteHashTable(ctx->Array.Objects);
_mesa_DeleteHashTable(ctx->Array.Objects, delete_arrayobj_cb, ctx);
}
void GLAPIENTRY