On Thu, Sep 5, 2013 at 8:43 PM, Alan Coopersmith <alan.coopersm...@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.coopersm...@oracle.com>
Reviewed-by: Alex Deucher <aleander.deuc...@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@lists.x.org: X.Org development > Archives: http://lists.x.org/archives/xorg-devel > Info: http://lists.x.org/mailman/listinfo/xorg-devel _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel