Remove c->out.vec. Pass iovecs directly down the call tree. Add _xcb_out_flush_to, refactor other functions, make write_block static.

This commit is contained in:
Jamey Sharp 2006-03-12 12:40:34 -08:00
parent 83e652f566
commit fb61c94d68
4 changed files with 53 additions and 50 deletions

View File

@ -89,8 +89,10 @@ static int write_setup(XCBConnection *c, XCBAuthInfo *auth_info)
assert(count <= sizeof(parts) / sizeof(*parts));
pthread_mutex_lock(&c->iolock);
_xcb_out_write_block(c, parts, count);
ret = _xcb_out_flush(c);
{
struct iovec *parts_ptr = parts;
ret = _xcb_out_send(c, &parts_ptr, &count);
}
pthread_mutex_unlock(&c->iolock);
return ret;
}

View File

@ -252,9 +252,8 @@ void *XCBWaitForReply(XCBConnection *c, unsigned int request, XCBGenericError **
pthread_mutex_lock(&c->iolock);
/* If this request has not been written yet, write it. */
if((signed int) (c->out.request_written - request) < 0)
if(!_xcb_out_flush(c))
goto done; /* error */
if(!_xcb_out_flush_to(c, request))
goto done; /* error */
for(prev_reader = &c->in.readers; *prev_reader && (*prev_reader)->request <= request; prev_reader = &(*prev_reader)->next)
if((*prev_reader)->request == request)

View File

@ -36,6 +36,26 @@
#include "xcbint.h"
#include "extensions/bigreq.h"
static int write_block(XCBConnection *c, struct iovec *vector, int count)
{
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[0].iov_base = (char *) vector[0].iov_base + vector[0].iov_len;
vector[0].iov_len = 0;
++vector, --count;
}
if(!count)
return 1;
--vector, ++count;
vector[0].iov_base = c->out.queue;
vector[0].iov_len = c->out.queue_len;
c->out.queue_len = 0;
return _xcb_out_send(c, &vector, &count);
}
/* Public interface */
CARD32 XCBGetMaximumRequestLength(XCBConnection *c)
@ -163,7 +183,7 @@ unsigned int XCBSendRequest(XCBConnection *c, int flags, struct iovec *vector, c
vector[0].iov_base = prefix + !prefix[0];
}
if(!_xcb_out_write_block(c, vector, veclen))
if(!write_block(c, vector, veclen))
request = 0;
pthread_mutex_unlock(&c->iolock);
return request;
@ -173,7 +193,7 @@ int XCBFlush(XCBConnection *c)
{
int ret;
pthread_mutex_lock(&c->iolock);
ret = _xcb_out_flush(c);
ret = _xcb_out_flush_to(c, c->out.request);
pthread_mutex_unlock(&c->iolock);
return ret;
}
@ -187,8 +207,6 @@ int _xcb_out_init(_xcb_out *out)
out->writing = 0;
out->queue_len = 0;
out->vec = 0;
out->vec_len = 0;
out->request = 0;
out->request_written = 0;
@ -234,46 +252,32 @@ int _xcb_out_write(XCBConnection *c, struct iovec **vector, int *count)
return 1;
}
int _xcb_out_write_block(XCBConnection *c, struct iovec *vector, size_t count)
{
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[0].iov_base = (char *) vector[0].iov_base + vector[0].iov_len;
vector[0].iov_len = 0;
++vector, --count;
}
if(!count)
return 1;
--vector, ++count;
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 _xcb_out_flush(XCBConnection *c)
int _xcb_out_send(XCBConnection *c, struct iovec **vector, int *count)
{
int ret = 1;
struct iovec vec;
if(c->out.queue_len)
{
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;
c->out.vec_len = 1;
c->out.queue_len = 0;
}
while(ret && c->out.vec_len)
ret = _xcb_conn_wait(c, &c->out.cond, &c->out.vec, &c->out.vec_len);
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;
}
int _xcb_out_flush_to(XCBConnection *c, unsigned int request)
{
assert(request <= c->out.request);
if(c->out.request_written >= request)
return 1;
if(c->out.queue_len)
{
struct iovec vec, *vec_ptr = &vec;
int count = 1;
vec.iov_base = c->out.queue;
vec.iov_len = c->out.queue_len;
c->out.queue_len = 0;
return _xcb_out_send(c, &vec_ptr, &count);
}
while(c->out.writing)
pthread_cond_wait(&c->out.cond, &c->iolock);
assert(c->out.request_written >= request);
return 1;
}

View File

@ -63,8 +63,6 @@ typedef struct _xcb_out {
char queue[4096];
int queue_len;
struct iovec *vec;
int vec_len;
unsigned int request;
unsigned int request_written;
@ -77,8 +75,8 @@ int _xcb_out_init(_xcb_out *out);
void _xcb_out_destroy(_xcb_out *out);
int _xcb_out_write(XCBConnection *c, struct iovec **vector, int *count);
int _xcb_out_write_block(XCBConnection *c, struct iovec *vector, size_t count);
int _xcb_out_flush(XCBConnection *c);
int _xcb_out_send(XCBConnection *c, struct iovec **vector, int *count);
int _xcb_out_flush_to(XCBConnection *c, unsigned int request);
/* xcb_in.c */