[PATCH] DMX glxproxy: Don't allocate & copy data just to free it unused

Alex Deucher alexdeucher at gmail.com
Fri Sep 6 06:04:42 PDT 2013


On Thu, Sep 5, 2013 at 8:43 PM, Alan Coopersmith
<alan.coopersmith at oracle.com> wrote:
> Two functions in the DMX glxproxy code loop over all the backend
> screens, starting at the highest numbered and counting down to
> the lowest.
>
> Previously, for each screen, the code would allocate a buffer
> large enough to read the reply from the backend, copy that reply
> into the buffer, and then if it wasn't the final screen, free it.
> Only the buffer from the final screen is used, to pass on to the
> client in the reply.
>
> This modifies it to just immediately discard the responses from
> the screens as we loop through it, only doing the allocate & copy
> work for the one buffer we pass back to the client.
>
> Signed-off-by: Alan Coopersmith <alan.coopersmith at oracle.com>

Reviewed-by: Alex Deucher <aleander.deucher at amd.com>

> ---
>  hw/dmx/glxProxy/glxsingle.c |   30 +++++++++++++++++-------------
>  hw/dmx/glxProxy/glxvendor.c |   30 +++++++++++++++++-------------
>  2 files changed, 34 insertions(+), 26 deletions(-)
>
> diff --git a/hw/dmx/glxProxy/glxsingle.c b/hw/dmx/glxProxy/glxsingle.c
> index abfb880..679a302 100644
> --- a/hw/dmx/glxProxy/glxsingle.c
> +++ b/hw/dmx/glxProxy/glxsingle.c
> @@ -349,25 +349,29 @@ __glXForwardAllWithReply(__GLXclientState * cl, GLbyte * pc)
>           * get the reply from the back-end server
>           */
>          _XReply(dpy, (xReply *) &be_reply, 0, False);
> -        be_buf_size = be_reply.length << 2;
> -        if (be_buf_size > 0) {
> -            be_buf = (char *) malloc(be_buf_size);
> -            if (be_buf) {
> -                _XRead(dpy, be_buf, be_buf_size);
> +        if (s == from_screen) {
> +            /* Save data from last reply to send on to client */
> +            be_buf_size = be_reply.length << 2;
> +            if (be_buf_size > 0) {
> +                be_buf = malloc(be_buf_size);
> +                if (be_buf) {
> +                    _XRead(dpy, be_buf, be_buf_size);
> +                }
> +                else {
> +                    /* Throw data on the floor */
> +                    _XEatDataWords(dpy, be_reply.length);
> +                    return BadAlloc;
> +                }
>              }
> -            else {
> -                /* Throw data on the floor */
> +        }
> +        else {
> +            /* Just discard data from all replies before the last one */
> +            if (be_reply.length > 0)
>                  _XEatDataWords(dpy, be_reply.length);
> -                return BadAlloc;
> -            }
>          }
>
>          UnlockDisplay(dpy);
>          SyncHandle();
> -
> -        if (s > from_screen && be_buf_size > 0) {
> -            free(be_buf);
> -        }
>      }
>
>      /*
> diff --git a/hw/dmx/glxProxy/glxvendor.c b/hw/dmx/glxProxy/glxvendor.c
> index 50d505c..b475daf 100644
> --- a/hw/dmx/glxProxy/glxvendor.c
> +++ b/hw/dmx/glxProxy/glxvendor.c
> @@ -332,25 +332,29 @@ __glXVForwardAllWithReply(__GLXclientState * cl, GLbyte * pc)
>           * get the reply from the back-end server
>           */
>          _XReply(dpy, (xReply *) &be_reply, 0, False);
> -        be_buf_size = be_reply.length << 2;
> -        if (be_buf_size > 0) {
> -            be_buf = (char *) malloc(be_buf_size);
> -            if (be_buf) {
> -                _XRead(dpy, be_buf, be_buf_size);
> +        if (s == from_screen) {
> +            /* Save data from last reply to send on to client */
> +            be_buf_size = be_reply.length << 2;
> +            if (be_buf_size > 0) {
> +                be_buf = malloc(be_buf_size);
> +                if (be_buf) {
> +                    _XRead(dpy, be_buf, be_buf_size);
> +                }
> +                else {
> +                    /* Throw data on the floor */
> +                    _XEatDataWords(dpy, be_reply.length);
> +                    return BadAlloc;
> +                }
>              }
> -            else {
> -                /* Throw data on the floor */
> +        }
> +        else {
> +            /* Just discard data from all replies before the last one */
> +            if (be_reply.length > 0)
>                  _XEatDataWords(dpy, be_reply.length);
> -                return BadAlloc;
> -            }
>          }
>
>          UnlockDisplay(dpy);
>          SyncHandle();
> -
> -        if (s > from_screen && be_buf_size > 0) {
> -            free(be_buf);
> -        }
>      }
>
>      /*
> --
> 1.7.9.2
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel


More information about the xorg-devel mailing list