From 9590ba97ad6606a96b50a66242f606c860ca239d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Fri, 11 May 2007 13:24:34 -0400 Subject: [PATCH] Avoid deadlock in GarbageCollectDRIDrawables. __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 | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/glx/x11/glxcmds.c b/src/glx/x11/glxcmds.c index b6c0c763e3b..75790c977ee 100644 --- a/src/glx/x11/glxcmds.c +++ b/src/glx/x11/glxcmds.c @@ -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 -- 2.30.2