Bugfix: protect the output queue from being written while another thread is flushing it.

This commit is contained in:
Jamey Sharp 2006-02-24 00:25:34 -08:00
parent 4e91ae275e
commit cdf362f33a

View File

@ -261,6 +261,9 @@ int _xcb_out_write(XCBConnection *c)
int _xcb_out_write_block(XCBConnection *c, struct iovec *vector, size_t count) 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)) 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); 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; vector[0].iov_len = c->out.queue_len;
c->out.queue_len = 0; c->out.queue_len = 0;
assert(!c->out.vec_len);
assert(!c->out.vec);
c->out.vec_len = count; c->out.vec_len = count;
c->out.vec = vector; c->out.vec = vector;
return _xcb_out_flush(c); return _xcb_out_flush(c);
@ -288,8 +289,7 @@ int _xcb_out_flush(XCBConnection *c)
struct iovec vec; struct iovec vec;
if(c->out.queue_len) if(c->out.queue_len)
{ {
assert(!c->out.vec_len); assert(!c->out.vec && !c->out.vec_len);
assert(!c->out.vec);
vec.iov_base = c->out.queue; vec.iov_base = c->out.queue;
vec.iov_len = c->out.queue_len; vec.iov_len = c->out.queue_len;
c->out.vec = &vec; c->out.vec = &vec;