On 04/07/2011 03:50 PM, Henri Verbeet wrote:
---
  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;
  }

Looks good.

-Brian

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to