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