[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