[PATCH glx] glx: avoid memory leak when using indirect rendering

Adam Jackson ajax at nwnk.net
Tue Dec 8 08:44:12 PST 2015


On Fri, 2015-12-04 at 14:16 -0200, Guilherme Quentel Melo wrote:

> diff --git a/glx/glxext.c b/glx/glxext.c
> index e41b881..16b8039 100644
> --- a/glx/glxext.c
> +++ b/glx/glxext.c
> @@ -469,6 +469,24 @@ __glXForceCurrent(__GLXclientState * cl, GLXContextTag tag, int *error)
>  
>      /* Make this context the current one for the GL. */
>      if (!cx->isDirect) {
> +        /*
> +         ** If we are forcing the context it means someone already called makeCurrent before. If
> +         ** we just call makeCurrent again, the drawable of this context will be left with one
> +         ** refcount more forever and will never be freed.
> +         **
> +         ** This situation happens when there are many X clients using GL:
> +         **
> +         ** 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. So the execution path
> +         **     will get here.
> +         */
> +        (*cx->loseCurrent) (cx);

This should be lastGLContext->loseCurrent(lastGLContext) I think. cx
here is the current context from client2's perspective, you want to
release client1's context.

While you're at it, it'd be nice to move that big block comment into
the commit message and just note /* drop previous client's context */
or similar in the code.

- ajax


More information about the xorg-devel mailing list