Remove XCB_CEIL and use a simpler definition for XCB_PAD.
[free-sw/xcb/libxcb] / src / xcb_out.c
index e7d5323..a6b0350 100644 (file)
@@ -137,7 +137,7 @@ int XCBSendRequest(XCBConnection *c, unsigned int *request, struct iovec *vector
 
     /* put together the length field, possibly using BIGREQUESTS */
     for(i = 0; i < req->count; ++i)
-        longlen += XCB_CEIL(vector[i].iov_len) >> 2;
+        longlen += (vector[i].iov_len + 3) >> 2;
 
     if(longlen > c->setup->maximum_request_length)
     {
@@ -261,6 +261,9 @@ int _xcb_out_write(XCBConnection *c)
 
 int _xcb_out_write_block(XCBConnection *c, struct iovec *vector, size_t count)
 {
+    while(c->out.writing)
+        pthread_cond_wait(&c->out.cond, &c->iolock);
+    assert(!c->out.vec && !c->out.vec_len);
     while(count && c->out.queue_len + vector[0].iov_len < sizeof(c->out.queue))
     {
         memcpy(c->out.queue + c->out.queue_len, vector[0].iov_base, vector[0].iov_len);
@@ -275,8 +278,6 @@ int _xcb_out_write_block(XCBConnection *c, struct iovec *vector, size_t count)
     vector[0].iov_len = c->out.queue_len;
     c->out.queue_len = 0;
 
-    assert(!c->out.vec_len);
-    assert(!c->out.vec);
     c->out.vec_len = count;
     c->out.vec = vector;
     return _xcb_out_flush(c);
@@ -288,8 +289,7 @@ int _xcb_out_flush(XCBConnection *c)
     struct iovec vec;
     if(c->out.queue_len)
     {
-        assert(!c->out.vec_len);
-        assert(!c->out.vec);
+        assert(!c->out.vec && !c->out.vec_len);
         vec.iov_base = c->out.queue;
         vec.iov_len = c->out.queue_len;
         c->out.vec = &vec;