[Mesa-dev] [PATCH] mesa syncobj: don't store a pointer to the set_entry

Jordan Justen jordan.l.justen at intel.com
Sat Dec 8 13:24:54 PST 2012


The set_entry pointer can become invalid if the set table
is re-hashed.

This likely will fix
https://bugs.freedesktop.org/show_bug.cgi?id=58012
(Regression since 56e95d3c)

Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
Cc: Stefan Dösinger <stefandoesinger at gmx.at>
Cc: Matt Turner <mattst88 at gmail.com>
---
 src/mesa/main/mtypes.h  |    1 -
 src/mesa/main/syncobj.c |   14 ++++++++++----
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index b353e70..11a8322 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2513,7 +2513,6 @@ struct gl_query_state
 /** Sync object state */
 struct gl_sync_object
 {
-   struct set_entry *SetEntry;
    GLenum Type;               /**< GL_SYNC_FENCE */
    GLuint Name;               /**< Fence name */
    GLint RefCount;            /**< Reference count */
diff --git a/src/mesa/main/syncobj.c b/src/mesa/main/syncobj.c
index f599982..b977bfa 100644
--- a/src/mesa/main/syncobj.c
+++ b/src/mesa/main/syncobj.c
@@ -199,10 +199,16 @@ _mesa_ref_sync_object(struct gl_context *ctx, struct gl_sync_object *syncObj)
 void
 _mesa_unref_sync_object(struct gl_context *ctx, struct gl_sync_object *syncObj)
 {
+   struct set_entry *entry;
+
    _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
    syncObj->RefCount--;
    if (syncObj->RefCount == 0) {
-      _mesa_set_remove(ctx->Shared->SyncObjects, syncObj->SetEntry);
+      entry = _mesa_set_search(ctx->Shared->SyncObjects,
+                               _mesa_hash_pointer(syncObj),
+                               syncObj);
+      assert (entry != NULL);
+      _mesa_set_remove(ctx->Shared->SyncObjects, entry);
       _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
 
       ctx->Driver.DeleteSyncObject(ctx, syncObj);
@@ -290,9 +296,9 @@ _mesa_FenceSync(GLenum condition, GLbitfield flags)
       ctx->Driver.FenceSync(ctx, syncObj, condition, flags);
 
       _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
-      syncObj->SetEntry = _mesa_set_add(ctx->Shared->SyncObjects,
-                                        _mesa_hash_pointer(syncObj),
-                                        syncObj);
+      _mesa_set_add(ctx->Shared->SyncObjects,
+                    _mesa_hash_pointer(syncObj),
+                    syncObj);
       _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
 
       return (GLsync) syncObj;
-- 
1.7.10.4



More information about the mesa-dev mailing list