summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--glx/createcontext.c2
-rw-r--r--glx/glxcmds.c14
-rw-r--r--glx/glxcontext.h10
-rw-r--r--glx/glxext.c33
4 files changed, 35 insertions, 24 deletions
diff --git a/glx/createcontext.c b/glx/createcontext.c
index 13d21ccb9..78792dab6 100644
--- a/glx/createcontext.c
+++ b/glx/createcontext.c
@@ -320,7 +320,7 @@ __glXDisp_CreateContextAttribsARB(__GLXclientState * cl, GLbyte * pc)
ctx->id = req->context;
ctx->share_id = req->shareList;
ctx->idExists = True;
- ctx->isCurrent = False;
+ ctx->currentClient = False;
ctx->isDirect = req->isDirect;
ctx->hasUnflushedCommands = False;
ctx->renderMode = GL_RENDER;
diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index df738b147..f7ca8267e 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -299,7 +299,7 @@ DoCreateContext(__GLXclientState * cl, GLXContextID gcId,
glxc->id = gcId;
glxc->share_id = shareList;
glxc->idExists = GL_TRUE;
- glxc->isCurrent = GL_FALSE;
+ glxc->currentClient = NULL;
glxc->isDirect = isDirect;
glxc->hasUnflushedCommands = GL_FALSE;
glxc->renderMode = GL_RENDER;
@@ -407,7 +407,7 @@ __glXDisp_DestroyContext(__GLXclientState * cl, GLbyte * pc)
return err;
glxc->idExists = GL_FALSE;
- if (!glxc->isCurrent)
+ if (!glxc->currentClient)
FreeResourceByType(req->context, __glXContextRes, FALSE);
return Success;
@@ -444,7 +444,7 @@ StopUsingContext(__GLXcontext * glxc)
/* Tell server GL library */
__glXLastContext = 0;
}
- glxc->isCurrent = GL_FALSE;
+ glxc->currentClient = NULL;
if (!glxc->idExists) {
FreeResourceByType(glxc->id, __glXContextRes, FALSE);
}
@@ -454,8 +454,8 @@ StopUsingContext(__GLXcontext * glxc)
static void
StartUsingContext(__GLXclientState * cl, __GLXcontext * glxc)
{
- glxc->isCurrent = GL_TRUE;
__glXLastContext = glxc;
+ glxc->currentClient = cl->client;
}
/**
@@ -589,7 +589,7 @@ DoMakeCurrent(__GLXclientState * cl,
if (!validGlxContext(client, contextId, DixUseAccess, &glxc, &error))
return error;
- if ((glxc != prevglxc) && glxc->isCurrent) {
+ if ((glxc != prevglxc) && glxc->currentClient) {
/* Context is current to somebody else */
return BadAccess;
}
@@ -652,7 +652,7 @@ DoMakeCurrent(__GLXclientState * cl,
return __glXError(GLXBadContext);
}
- glxc->isCurrent = GL_TRUE;
+ glxc->currentClient = client;
}
StopUsingContext(prevglxc);
@@ -873,7 +873,7 @@ __glXDisp_CopyContext(__GLXclientState * cl, GLbyte * pc)
/*
** The destination context must not be current for any client.
*/
- if (dst->isCurrent) {
+ if (dst->currentClient) {
client->errorValue = dest;
return BadAccess;
}
diff --git a/glx/glxcontext.h b/glx/glxcontext.h
index 3d08c9929..677898a67 100644
--- a/glx/glxcontext.h
+++ b/glx/glxcontext.h
@@ -69,6 +69,11 @@ struct __GLXcontext {
__GLXscreen *pGlxScreen;
/*
+ ** If this context is current for a client, this will be that client
+ */
+ ClientPtr currentClient;
+
+ /*
** The XID of this context.
*/
XID id;
@@ -84,11 +89,6 @@ struct __GLXcontext {
GLboolean idExists;
/*
- ** Whether this context is current for some client.
- */
- GLboolean isCurrent;
-
- /*
** Whether this context is a direct rendering context.
*/
GLboolean isDirect;
diff --git a/glx/glxext.c b/glx/glxext.c
index 2c3f5edf0..dcefecdac 100644
--- a/glx/glxext.c
+++ b/glx/glxext.c
@@ -95,16 +95,15 @@ __glXResetLargeCommandStatus(__GLXclientState * cl)
}
/*
-** This procedure is called when the client who created the context goes
-** away OR when glXDestroyContext is called. In either case, all we do is
-** flag that the ID is no longer valid, and (maybe) free the context.
-** use.
-*/
+ * This procedure is called when the client who created the context goes away
+ * OR when glXDestroyContext is called. In either case, all we do is flag that
+ * the ID is no longer valid, and (maybe) free the context.
+ */
static int
ContextGone(__GLXcontext * cx, XID id)
{
cx->idExists = GL_FALSE;
- if (!cx->isCurrent) {
+ if (!cx->currentClient) {
__glXFreeContext(cx);
}
@@ -138,9 +137,10 @@ DrawableGone(__GLXdrawable * glxPriv, XID xid)
for (c = glxAllContexts; c; c = next) {
next = c->next;
- if (c->isCurrent && (c->drawPriv == glxPriv || c->readPriv == glxPriv)) {
+ if (c->currentClient &&
+ (c->drawPriv == glxPriv || c->readPriv == glxPriv)) {
(*c->loseCurrent) (c);
- c->isCurrent = GL_FALSE;
+ c->currentClient = NULL;
if (c == __glXLastContext)
__glXFlushContextCache();
}
@@ -196,17 +196,17 @@ __glXRemoveFromContextList(__GLXcontext * cx)
GLboolean
__glXFreeContext(__GLXcontext * cx)
{
- if (cx->idExists || cx->isCurrent)
+ if (cx->idExists || cx->currentClient)
return GL_FALSE;
+ __glXRemoveFromContextList(cx);
+
free(cx->feedbackBuf);
free(cx->selectBuf);
if (cx == __glXLastContext) {
__glXFlushContextCache();
}
- __glXRemoveFromContextList(cx);
-
/* We can get here through both regular dispatching from
* __glXDispatch() or as a callback from the resource manager. In
* the latter case we need to lift the DRI lock manually. */
@@ -283,6 +283,7 @@ glxClientCallback(CallbackListPtr *list, pointer closure, pointer data)
NewClientInfoRec *clientinfo = (NewClientInfoRec *) data;
ClientPtr pClient = clientinfo->client;
__GLXclientState *cl = glxGetClient(pClient);
+ __GLXcontext *c, *next;
switch (pClient->clientState) {
case ClientStateRunning:
@@ -290,6 +291,16 @@ glxClientCallback(CallbackListPtr *list, pointer closure, pointer data)
break;
case ClientStateGone:
+ /* detach from all current contexts */
+ for (c = glxAllContexts; c; c = next) {
+ next = c->next;
+ if (c->currentClient == pClient) {
+ c->loseCurrent(c);
+ c->currentClient = NULL;
+ __glXFreeContext(c);
+ }
+ }
+
free(cl->returnBuf);
free(cl->largeCmdBuf);
free(cl->GLClientextensions);