Avoid deadlock in GarbageCollectDRIDrawables.
authorKristian Høgsberg <krh@hinata.boston.redhat.com>
Fri, 11 May 2007 17:24:34 +0000 (13:24 -0400)
committerKristian Høgsberg <krh@redhat.com>
Wed, 10 Oct 2007 21:09:36 +0000 (17:09 -0400)
__glXinitialize() can't be called with the GLX lock held.  Just
pass in the __GLXscreenConfigs pointer so we don't have to look it
up in __GLXdisplayPrivate.

src/glx/x11/glxcmds.c

index b6c0c763e3bff61c97678f828786c8c4786e718c..75790c977ee0c91975f1825f2c1c60d9f2869e98 100644 (file)
@@ -80,24 +80,18 @@ static int windowExistsErrorHandler(Display *dpy, XErrorEvent *xerr)
  * \param dpy    Display to destroy drawables for
  * \param screen Screen number to destroy drawables for
  */
-static void GarbageCollectDRIDrawables(Display *dpy, int screen)
+static void GarbageCollectDRIDrawables(Display *dpy, __GLXscreenConfigs *sc)
 {
-    __GLXdisplayPrivate * const priv = __glXInitialize(dpy);
-    __GLXscreenConfigs *sc;
     __DRIid draw;
     __GLXdrawable *pdraw;
     XWindowAttributes xwa;
     int (*oldXErrorHandler)(Display *, XErrorEvent *);
 
-    if (priv == NULL || priv->driDisplay.private == NULL)
-       return;
-
     /* Set no-op error handler so Xlib doesn't bail out if the windows
      * has alreay been destroyed on the server. */
     XSync(dpy, GL_FALSE);
     oldXErrorHandler = XSetErrorHandler(windowExistsErrorHandler);
 
-    sc = &priv->screenConfigs[screen];
     if (__glxHashFirst(sc->drawHash, &draw, (void *)&pdraw) == 1) {
        do {
            windowExistsFlag = GL_TRUE;
@@ -540,7 +534,7 @@ DestroyContext(Display *dpy, GLXContext gc)
            XF86DRIDestroyContext(dpy, gc->psc->scr, gc->hwContextID);
            gc->driContext.private = NULL;
        }
-       GarbageCollectDRIDrawables(dpy, gc->screen);
+       GarbageCollectDRIDrawables(dpy, gc->psc);
     }
 #endif