glx: avoid memory leak when using indirect rendering
When multiple processes are using GL with indirect rendering a race condition can make drawables refcount never drop to zero. This situation could happen when there are many X clients using indirect GLX: 1 - client1: calls glXMakeCurrent 2 - client2: calls glXMakeCurrent This is the first context switch for this client. So old_context_tag=0 3 - client1: calls glXRender For the client, its context is already current. For the server side lastGLContext points to client2's context. Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Guilherme Quentel Melo <gqmelo@gmail.com>
This commit is contained in:
parent
266cf39a8f
commit
a134d1e7ea
|
@ -466,6 +466,12 @@ __glXForceCurrent(__GLXclientState * cl, GLXContextTag tag, int *error)
|
||||||
|
|
||||||
/* Make this context the current one for the GL. */
|
/* Make this context the current one for the GL. */
|
||||||
if (!cx->isDirect) {
|
if (!cx->isDirect) {
|
||||||
|
/*
|
||||||
|
* If it is being forced, it means that this context was already made
|
||||||
|
* current. So it cannot just be made current again without decrementing
|
||||||
|
* refcount's
|
||||||
|
*/
|
||||||
|
(*cx->loseCurrent) (cx);
|
||||||
lastGLContext = cx;
|
lastGLContext = cx;
|
||||||
if (!(*cx->makeCurrent) (cx)) {
|
if (!(*cx->makeCurrent) (cx)) {
|
||||||
/* Bind failed, and set the error code. Bummer */
|
/* Bind failed, and set the error code. Bummer */
|
||||||
|
|
Loading…
Reference in New Issue