[Xquartz-changes] [289] AppleSGLX/trunk

source_changes at macosforge.org source_changes at macosforge.org
Sat Mar 7 00:55:41 PST 2009


Revision: 289
          http://trac.macosforge.org/projects/xquartz/changeset/289
Author:   gstaplin at apple.com
Date:     2009-03-07 00:55:38 -0800 (Sat, 07 Mar 2009)
Log Message:
-----------
Fix an error that occurred with an invalid GLXPbuffer generating
a failed XGetGeometry XErrorEvent.  The proper XError for 
glXQueryDrawable is GLXBadDrawable, so add some error catching 
to fall through to the __glXSendError().

Modified Paths:
--------------
    AppleSGLX/trunk/glx_pbuffer.c
    AppleSGLX/trunk/tests/pbuffer/pbuffer_destroy.c

Modified: AppleSGLX/trunk/glx_pbuffer.c
===================================================================
--- AppleSGLX/trunk/glx_pbuffer.c	2009-03-06 19:11:36 UTC (rev 288)
+++ AppleSGLX/trunk/glx_pbuffer.c	2009-03-07 08:55:38 UTC (rev 289)
@@ -31,19 +31,34 @@
  */
 
 #include <inttypes.h>
+#include <pthread.h>
 #include "glxclient.h"
 #include <X11/extensions/extutil.h>
 #include <X11/extensions/Xext.h>
 #include <assert.h>
 #include <string.h>
-//#include "glapi.h"
 #include "glxextensions.h"
 #include "glcontextmodes.h"
-//#include "glheader.h"
 
+
 #include "apple_glx_drawable.h"
 #include "glx_error.h"
 
+
+static pthread_mutex_t queryLock = PTHREAD_MUTEX_INITIALIZER;
+
+/* 
+ * This is protected by the queryLock.
+ * Unfortunately XSetErrorHandler requires a lock. 
+ */
+static int errorCount = 0;
+
+static int
+errorHandler(Display *dpy, XErrorEvent *error) {
+    ++errorCount;
+    return 0; /* don't exit */
+}
+
 /**
  * Create a new pbuffer.
  */
@@ -109,7 +124,6 @@
     }
 }
 
-
 /**
  * Query an attribute of a drawable.
  */
@@ -119,6 +133,7 @@
     Window root;
     int x, y;
     unsigned int width, height, bd, depth;
+    int (*old_handler)(Display *, XErrorEvent *);
 
     if(apple_glx_pixmap_query(drawable, attribute, value))
 	return; /*done*/
@@ -126,6 +141,15 @@
     if(apple_glx_pbuffer_query(drawable, attribute, value))
 	return; /*done*/
 
+    /*
+     * This is used because XSetErrorHandler changes global state.
+     * Ideally we should prevent other threads from calling XSetErrorHandler.
+     * Another way of handling this might be a private display connection.
+     */
+    pthread_mutex_lock(&queryLock);
+
+    old_handler = XSetErrorHandler(errorHandler);
+
     if(XGetGeometry(dpy, drawable, &root, &x, &y, &width, &height, &bd, &depth)) {
 	switch(attribute) {
 	case GLX_WIDTH:
@@ -139,7 +163,10 @@
 	/*FALL THROUGH*/
     }
 
+    XSetErrorHandler(old_handler);
 
+    pthread_mutex_unlock(&queryLock);
+
     __glXSendError(dpy, GLXBadDrawable, drawable, X_GLXGetDrawableAttributes,
 		   false);
 }

Modified: AppleSGLX/trunk/tests/pbuffer/pbuffer_destroy.c
===================================================================
--- AppleSGLX/trunk/tests/pbuffer/pbuffer_destroy.c	2009-03-06 19:11:36 UTC (rev 288)
+++ AppleSGLX/trunk/tests/pbuffer/pbuffer_destroy.c	2009-03-07 08:55:38 UTC (rev 289)
@@ -7,32 +7,6 @@
 GLXPbuffer pbuf;
 
 void dump_pbuffer(Display *dpy) {
-    size_t length = 400 * 400 * /*RGBA*/ 4;
-    void *p = malloc(length);
-    unsigned char *cp;
-    int x, y;
-
-    if(NULL == p) {
-	perror("malloc");
-	abort();
-    }
-
-    memset(p, 0, length);
-
-    glReadPixels(0, 0, 400, 400, GL_RGBA, GL_UNSIGNED_BYTE, p); 
-
-    cp = p;
-    for(y = 0; y < 400; ++y) {
-	for(x = 0; x < 400; ++x) {
-	    printf("%d %d %d %d, ", cp[0], cp[1], cp[2], cp[3]);
-	    cp += 4;
-	}
-	putchar('\n');	    
-    }
-
-    free(p);
-
-    {
 	unsigned int width = 0, height = 0, fbid = 0;
 
 	glXQueryDrawable(dpy, pbuf, GLX_WIDTH, &width);
@@ -41,8 +15,6 @@
 
 	printf("queried drawable width %u height %u fbconfigID %x\n",
 	       width, height, fbid);
-	
-    }
 }
 
 void draw(Display *dpy) {
@@ -160,7 +132,9 @@
     draw(dpy);
     glXDestroyPbuffer(dpy, pbuf);
     draw(dpy);
+    /* This should release the final reference to the pbuffer. */
     glXMakeCurrent(dpy, None, ctx);
+    printf("Expect a GLXBadDrawable error.\n");
     draw(dpy);
 	
     return EXIT_SUCCESS;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/xquartz-changes/attachments/20090307/3bdc50ea/attachment-0001.html>


More information about the Xquartz-changes mailing list