diff options
author | Guilherme Quentel Melo <gqmelo@gmail.com> | 2016-05-10 00:29:58 +0000 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2016-06-20 13:25:41 -0400 |
commit | a134d1e7eada0ac90fb622f45833c87b72c9aa06 (patch) | |
tree | 7dc7ee536fabadb82fb5a9aa81ab54886feb9a30 /glx | |
parent | 266cf39a8f108e2f365a9772f4ee4d9fca88eb36 (diff) |
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>
Diffstat (limited to 'glx')
-rw-r--r-- | glx/glxext.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/glx/glxext.c b/glx/glxext.c index 67ec07f09..0de910936 100644 --- a/glx/glxext.c +++ b/glx/glxext.c @@ -466,6 +466,12 @@ __glXForceCurrent(__GLXclientState * cl, GLXContextTag tag, int *error) /* Make this context the current one for the GL. */ 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; if (!(*cx->makeCurrent) (cx)) { /* Bind failed, and set the error code. Bummer */ |