Mesa (master): glx: Only remove the glx_display from the list after it' s destroyed.

Henri Verbeet hverbeet at kemper.freedesktop.org
Sun Apr 10 09:55:13 PDT 2011


Module: Mesa
Branch: master
Commit: a26121f37530619610a78a5fbe5ef87e44047fda
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a26121f37530619610a78a5fbe5ef87e44047fda

Author: Henri Verbeet <hverbeet at gmail.com>
Date:   Thu Apr  7 23:48:28 2011 +0200

glx: Only remove the glx_display from the list after it's destroyed.

Signed-off-by: Henri Verbeet <hverbeet at gmail.com>

---

 src/glx/glxext.c |   11 ++++++++---
 1 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/glx/glxext.c b/src/glx/glxext.c
index e35dcb7..278c719 100644
--- a/src/glx/glxext.c
+++ b/src/glx/glxext.c
@@ -250,19 +250,24 @@ glx_display_free(struct glx_display *priv)
 static int
 __glXCloseDisplay(Display * dpy, XExtCodes * codes)
 {
-   struct glx_display *priv, **prev;
+   struct glx_display *priv, **prev, *next;
 
    _XLockMutex(_Xglobal_lock);
    prev = &glx_displays;
    for (priv = glx_displays; priv; prev = &priv->next, priv = priv->next) {
       if (priv->dpy == dpy) {
-	 (*prev) = priv->next;
 	 break;
       }
    }
-   _XUnlockMutex(_Xglobal_lock);
 
+   /* Only remove the display from the list after it's destroyed. The cleanup
+    * code (e.g. driReleaseDrawables()) ends up calling __glXInitialize(),
+    * which would create a new glx_display while we're trying to destroy this
+    * one. */
+   next = priv->next;
    glx_display_free(priv);
+   *prev = next;
+   _XUnlockMutex(_Xglobal_lock);
 
    return 1;
 }



More information about the mesa-commit mailing list