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:
parent
6c06c268ad
commit
2704bdb24a
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue
Block a user