Mesa (master): mesa: remove 2 recursive lock usages of _mesa_HashTable

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Apr 1 19:35:11 UTC 2021


Module: Mesa
Branch: master
Commit: 46c4ae5ff190e29c147174cee7772c6e8d7ecee3
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=46c4ae5ff190e29c147174cee7772c6e8d7ecee3

Author: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Date:   Thu Mar 11 20:40:11 2021 +0100

mesa: remove 2 recursive lock usages of _mesa_HashTable

Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9533>

---

 src/mesa/main/hash.c      | 14 +++++++++-----
 src/mesa/main/shaderobj.c | 30 ++++++++++++++++++++++--------
 2 files changed, 31 insertions(+), 13 deletions(-)

diff --git a/src/mesa/main/hash.c b/src/mesa/main/hash.c
index 4f06ce2cda4..9ad89b23f60 100644
--- a/src/mesa/main/hash.c
+++ b/src/mesa/main/hash.c
@@ -104,19 +104,23 @@ _mesa_DeleteHashTable(struct _mesa_HashTable *table)
    free(table);
 }
 
-void
-_mesa_HashEnableNameReuse(struct _mesa_HashTable *table)
+static void init_name_reuse(struct _mesa_HashTable *table)
 {
-   _mesa_HashLockMutex(table);
    assert(_mesa_hash_table_num_entries(table->ht) == 0);
    table->id_alloc = MALLOC_STRUCT(util_idalloc);
    util_idalloc_init(table->id_alloc);
    util_idalloc_resize(table->id_alloc, 8);
    ASSERTED GLuint reserve0 = util_idalloc_alloc(table->id_alloc);
    assert (reserve0 == 0);
-   _mesa_HashUnlockMutex(table);
 }
 
+void
+_mesa_HashEnableNameReuse(struct _mesa_HashTable *table)
+{
+   _mesa_HashLockMutex(table);
+   init_name_reuse(table);
+   _mesa_HashUnlockMutex(table);
+}
 
 /**
  * Lookup an entry in the hash table, without locking.
@@ -327,7 +331,7 @@ _mesa_HashDeleteAll(struct _mesa_HashTable *table,
    if (table->id_alloc) {
       util_idalloc_fini(table->id_alloc);
       free(table->id_alloc);
-      _mesa_HashEnableNameReuse(table);
+      init_name_reuse(table);
    }
    table->MaxKey = 0;
    _mesa_HashUnlockMutex(table);
diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c
index ded74d1ec45..3a3483c0182 100644
--- a/src/mesa/main/shaderobj.c
+++ b/src/mesa/main/shaderobj.c
@@ -55,9 +55,9 @@
  * if refcount hits zero).
  * Then set ptr to point to sh, incrementing its refcount.
  */
-void
-_mesa_reference_shader(struct gl_context *ctx, struct gl_shader **ptr,
-                       struct gl_shader *sh)
+static void
+_reference_shader(struct gl_context *ctx, struct gl_shader **ptr,
+                       struct gl_shader *sh, bool skip_locking)
 {
    assert(ptr);
    if (*ptr == sh) {
@@ -71,8 +71,12 @@ _mesa_reference_shader(struct gl_context *ctx, struct gl_shader **ptr,
       assert(old->RefCount > 0);
 
       if (p_atomic_dec_zero(&old->RefCount)) {
-	 if (old->Name != 0)
-	    _mesa_HashRemove(ctx->Shared->ShaderObjects, old->Name);
+         if (old->Name != 0) {
+            if (skip_locking)
+               _mesa_HashRemoveLocked(ctx->Shared->ShaderObjects, old->Name);
+            else
+               _mesa_HashRemove(ctx->Shared->ShaderObjects, old->Name);
+         }
          _mesa_delete_shader(ctx, old);
       }
 
@@ -87,6 +91,13 @@ _mesa_reference_shader(struct gl_context *ctx, struct gl_shader **ptr,
    }
 }
 
+void
+_mesa_reference_shader(struct gl_context *ctx, struct gl_shader **ptr,
+                       struct gl_shader *sh)
+{
+   _reference_shader(ctx, ptr, sh, false);
+}
+
 static void
 _mesa_init_shader(struct gl_shader *shader)
 {
@@ -252,9 +263,11 @@ _mesa_reference_shader_program_(struct gl_context *ctx,
       assert(old->RefCount > 0);
 
       if (p_atomic_dec_zero(&old->RefCount)) {
-	 if (old->Name != 0)
-	    _mesa_HashRemove(ctx->Shared->ShaderObjects, old->Name);
+         _mesa_HashLockMutex(ctx->Shared->ShaderObjects);
+         if (old->Name != 0)
+	         _mesa_HashRemoveLocked(ctx->Shared->ShaderObjects, old->Name);
          _mesa_delete_shader_program(ctx, old);
+         _mesa_HashUnlockMutex(ctx->Shared->ShaderObjects);
       }
 
       *ptr = NULL;
@@ -356,6 +369,7 @@ _mesa_clear_shader_program_data(struct gl_context *ctx,
 /**
  * Free all the data that hangs off a shader program object, but not the
  * object itself.
+ * Must be called with shared->ShaderObjects locked.
  */
 void
 _mesa_free_shader_program_data(struct gl_context *ctx,
@@ -384,7 +398,7 @@ _mesa_free_shader_program_data(struct gl_context *ctx,
 
    /* detach shaders */
    for (i = 0; i < shProg->NumShaders; i++) {
-      _mesa_reference_shader(ctx, &shProg->Shaders[i], NULL);
+      _reference_shader(ctx, &shProg->Shaders[i], NULL, true);
    }
    shProg->NumShaders = 0;
 



More information about the mesa-commit mailing list