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

Signed-off-by: Henri Verbeet <hverbeet@gmail.com>
This commit is contained in:
Henri Verbeet 2011-04-07 23:48:28 +02:00
parent a75de67c51
commit a26121f375
1 changed files with 8 additions and 3 deletions

View File

@ -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;
}