[Xquartz-changes] [285] AppleSGLX/trunk

source_changes at macosforge.org source_changes at macosforge.org
Thu Mar 5 02:30:00 PST 2009


Revision: 285
          http://trac.macosforge.org/projects/xquartz/changeset/285
Author:   gstaplin at apple.com
Date:     2009-03-05 02:29:58 -0800 (Thu, 05 Mar 2009)
Log Message:
-----------
Fix a deadlock pattern with surface destruction.

Make the drawable mutex be a recursive type to resolve
this issue.

Modified Paths:
--------------
    AppleSGLX/trunk/apple_glx_drawable.c
    AppleSGLX/trunk/apple_glx_surface.c

Modified: AppleSGLX/trunk/apple_glx_drawable.c
===================================================================
--- AppleSGLX/trunk/apple_glx_drawable.c	2009-03-04 01:13:18 UTC (rev 284)
+++ AppleSGLX/trunk/apple_glx_drawable.c	2009-03-05 10:29:58 UTC (rev 285)
@@ -205,19 +205,41 @@
 static void common_init(Display *dpy, GLXDrawable drawable, 
 			struct apple_glx_drawable *d) {
     int err;
-
+    pthread_mutexattr_t attr;
+    
     d->display = dpy;
     d->reference_count = 0;
     d->drawable = drawable;
     d->type = -1;
 
-    err = pthread_mutex_init(&d->mutex, NULL);
+    err = pthread_mutexattr_init(&attr);
+
+    if(err) {
+	fprintf(stderr, "pthread_mutexattr_init error: %d\n", err);
+	abort();
+    }
+
+    /* 
+     * There are some patterns that require a recursive mutex,
+     * when working with locks that protect the apple_glx_drawable,
+     * and reference functions like ->reference, and ->release.
+     */
+    err = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+
+    if(err) {
+	fprintf(stderr, "error: setting pthread mutex type: %d\n", err);
+	abort();
+    }
+
+    err = pthread_mutex_init(&d->mutex, &attr);
     
     if(err) {
 	fprintf(stderr, "pthread_mutex_init error: %d\n", err);
 	abort();
     }
 
+    (void)pthread_mutexattr_destroy(&attr);
+
     d->lock = drawable_lock;
     d->unlock = drawable_unlock;
 

Modified: AppleSGLX/trunk/apple_glx_surface.c
===================================================================
--- AppleSGLX/trunk/apple_glx_surface.c	2009-03-04 01:13:18 UTC (rev 284)
+++ AppleSGLX/trunk/apple_glx_surface.c	2009-03-05 10:29:58 UTC (rev 285)
@@ -187,7 +187,7 @@
 void apple_glx_surface_destroy(unsigned int uid) {
     struct apple_glx_drawable *d;
     
-    d = apple_glx_drawable_find_by_uid(uid, APPLE_GLX_DRAWABLE_REFERENCE 
+    d = apple_glx_drawable_find_by_uid(uid, APPLE_GLX_DRAWABLE_REFERENCE
 				       | APPLE_GLX_DRAWABLE_LOCK);
 
     if(d) {
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/xquartz-changes/attachments/20090305/bf35fc95/attachment.html>


More information about the Xquartz-changes mailing list