[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