- while((req->isvoid &&
- c->out.request == c->in.request_expected + (1 << 16) - 1) ||
- request == 0)
- {
- prefix[0] = sync_req.packet;
- _xcb_in_expect_reply(c, request, WORKAROUND_NONE, XCB_REQUEST_DISCARD_REPLY);
- c->in.request_expected = c->out.request;
- request = ++c->out.request;
- }
-
- if(workaround != WORKAROUND_NONE || flags != 0)
- _xcb_in_expect_reply(c, request, workaround, flags);
- if(!req->isvoid)
- c->in.request_expected = c->out.request;
-
- if(prefix[0] || prefix[2])
- {
- --vector, ++veclen;
- if(prefix[2])
- {
- prefix[1] = ((uint32_t *) vector[1].iov_base)[0];
- vector[1].iov_base = (uint32_t *) vector[1].iov_base + 1;
- vector[1].iov_len -= sizeof(uint32_t);
- }
- vector[0].iov_len = sizeof(uint32_t) * ((prefix[0] ? 1 : 0) + (prefix[2] ? 2 : 0));
- vector[0].iov_base = prefix + !prefix[0];
- }
-
- if(!write_block(c, vector, veclen))
- {
- _xcb_conn_shutdown(c);
- request = 0;
- }
+ if((unsigned int) (c->out.request + 1) == 0)
+ send_sync(c);
+
+ /* The above send_sync calls could drop the I/O lock, but this
+ * thread will still exclude any other thread that tries to write,
+ * so the sequence number postconditions still hold. */
+ send_request(c, req->isvoid, workaround, flags, vector, veclen);
+ request = c->has_error ? 0 : c->out.request;