Revision: 285 http://trac.macosforge.org/projects/xquartz/changeset/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: -------------- 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) {
participants (1)
-
source_changes@macosforge.org