mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 03:08:05 +02:00
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:
parent
d33bffd708
commit
8ca750a8b6
10 changed files with 73 additions and 116 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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 *
|
||||
|
|
|
|||
|
|
@ -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 *
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue