Buffer a couple CARD32s on the stack instead of using an extra iovec. Also a bugfix...
authorJamey Sharp <jamey@minilop.net>
Mon, 27 Feb 2006 20:12:33 +0000 (12:12 -0800)
committerJamey Sharp <jamey@minilop.net>
Mon, 27 Feb 2006 20:12:33 +0000 (12:12 -0800)
src/xcb_out.c

index b89af56..42050f5 100644 (file)
@@ -84,6 +84,7 @@ int XCBSendRequest(XCBConnection *c, unsigned int *request, int flags, struct io
     static const char pad[3];
     int ret;
     int i;
+    CARD32 prefix[2];
     struct iovec *padded;
     int padlen = 0;
     enum workarounds workaround = WORKAROUND_NONE;
@@ -99,7 +100,7 @@ int XCBSendRequest(XCBConnection *c, unsigned int *request, int flags, struct io
 #else
         malloc
 #endif
-        ((req->count * 2 + 3) * sizeof(struct iovec));
+        ((req->count * 2 + 2) * sizeof(struct iovec));
 
     if(!(flags & XCB_REQUEST_RAW))
     {
@@ -134,14 +135,13 @@ int XCBSendRequest(XCBConnection *c, unsigned int *request, int flags, struct io
         ((CARD16 *) vector[0].iov_base)[1] = shortlen;
         if(!shortlen)
         {
-            padded[0].iov_base = vector[0].iov_base;
-            padded[0].iov_len = sizeof(CARD32);
+            padded[0].iov_base = prefix;
+            padded[0].iov_len = sizeof(prefix);
+            prefix[0] = ((CARD32 *) vector[0].iov_base)[0];
+            prefix[1] = ++longlen;
             vector[0].iov_base = ((char *) vector[0].iov_base) + sizeof(CARD32);
             vector[0].iov_len -= sizeof(CARD32);
-            ++longlen;
-            padded[1].iov_base = &longlen;
-            padded[1].iov_len = sizeof(CARD32);
-            padlen = 2;
+            padlen = 1;
         }
     }
     flags &= ~XCB_REQUEST_RAW;