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

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@oracle.com>
Reviewed-by: Alex Deucher <aleander.deucher@amd.com>
This commit is contained in:
Alan Coopersmith 2013-09-03 22:53:28 -07:00
parent 6c06c268ad
commit 2704bdb24a
2 changed files with 34 additions and 26 deletions

View File

@ -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);
}
}
/*

View File

@ -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);
}
}
/*