Revision
285
Author
gstaplin@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

Diff

Modified: AppleSGLX/trunk/apple_glx_drawable.c (284 => 285)


--- 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 (284 => 285)


--- 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) {