- 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);
- c->out.queue_len += vector[0].iov_len;
- ++vector, --count;
- }
- if(!count)
- return 1;
-
- memmove(vector + 1, vector, count++ * sizeof(struct iovec));
- vector[0].iov_base = c->out.queue;
- vector[0].iov_len = c->out.queue_len;
- c->out.queue_len = 0;
-
- c->out.vec_len = count;
- c->out.vec = vector;
- return _xcb_out_flush(c);
+ int ret = 1;
+ while(ret && *count)
+ ret = _xcb_conn_wait(c, &c->out.cond, vector, count);
+ c->out.request_written = c->out.request;
+ pthread_cond_broadcast(&c->out.cond);
+ return ret;