Mesa (master): mesa syncobj: don't store a pointer to the set_entry

Jordan Justen jljusten at kemper.freedesktop.org
Mon Dec 10 19:07:55 UTC 2012


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

Author: Jordan Justen <jordan.l.justen at intel.com>
Date:   Sat Dec  8 12:43:10 2012 -0800

mesa syncobj: don't store a pointer to the set_entry

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>
Reviewed-by: Eric Anholt <eric at anholt.net>

---

 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;




More information about the mesa-commit mailing list