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:
parent
83e652f566
commit
fb61c94d68
|
@ -89,8 +89,10 @@ static int write_setup(XCBConnection *c, XCBAuthInfo *auth_info)
|
||||||
assert(count <= sizeof(parts) / sizeof(*parts));
|
assert(count <= sizeof(parts) / sizeof(*parts));
|
||||||
|
|
||||||
pthread_mutex_lock(&c->iolock);
|
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);
|
pthread_mutex_unlock(&c->iolock);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -252,9 +252,8 @@ void *XCBWaitForReply(XCBConnection *c, unsigned int request, XCBGenericError **
|
||||||
pthread_mutex_lock(&c->iolock);
|
pthread_mutex_lock(&c->iolock);
|
||||||
|
|
||||||
/* If this request has not been written yet, write it. */
|
/* If this request has not been written yet, write it. */
|
||||||
if((signed int) (c->out.request_written - request) < 0)
|
if(!_xcb_out_flush_to(c, request))
|
||||||
if(!_xcb_out_flush(c))
|
goto done; /* error */
|
||||||
goto done; /* error */
|
|
||||||
|
|
||||||
for(prev_reader = &c->in.readers; *prev_reader && (*prev_reader)->request <= request; prev_reader = &(*prev_reader)->next)
|
for(prev_reader = &c->in.readers; *prev_reader && (*prev_reader)->request <= request; prev_reader = &(*prev_reader)->next)
|
||||||
if((*prev_reader)->request == request)
|
if((*prev_reader)->request == request)
|
||||||
|
|
|
@ -36,6 +36,26 @@
|
||||||
#include "xcbint.h"
|
#include "xcbint.h"
|
||||||
#include "extensions/bigreq.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 */
|
/* Public interface */
|
||||||
|
|
||||||
CARD32 XCBGetMaximumRequestLength(XCBConnection *c)
|
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];
|
vector[0].iov_base = prefix + !prefix[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!_xcb_out_write_block(c, vector, veclen))
|
if(!write_block(c, vector, veclen))
|
||||||
request = 0;
|
request = 0;
|
||||||
pthread_mutex_unlock(&c->iolock);
|
pthread_mutex_unlock(&c->iolock);
|
||||||
return request;
|
return request;
|
||||||
|
@ -173,7 +193,7 @@ int XCBFlush(XCBConnection *c)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
pthread_mutex_lock(&c->iolock);
|
pthread_mutex_lock(&c->iolock);
|
||||||
ret = _xcb_out_flush(c);
|
ret = _xcb_out_flush_to(c, c->out.request);
|
||||||
pthread_mutex_unlock(&c->iolock);
|
pthread_mutex_unlock(&c->iolock);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -187,8 +207,6 @@ int _xcb_out_init(_xcb_out *out)
|
||||||
out->writing = 0;
|
out->writing = 0;
|
||||||
|
|
||||||
out->queue_len = 0;
|
out->queue_len = 0;
|
||||||
out->vec = 0;
|
|
||||||
out->vec_len = 0;
|
|
||||||
|
|
||||||
out->request = 0;
|
out->request = 0;
|
||||||
out->request_written = 0;
|
out->request_written = 0;
|
||||||
|
@ -234,46 +252,32 @@ int _xcb_out_write(XCBConnection *c, struct iovec **vector, int *count)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _xcb_out_write_block(XCBConnection *c, struct iovec *vector, size_t count)
|
int _xcb_out_send(XCBConnection *c, struct iovec **vector, int *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 ret = 1;
|
int ret = 1;
|
||||||
struct iovec vec;
|
while(ret && *count)
|
||||||
if(c->out.queue_len)
|
ret = _xcb_conn_wait(c, &c->out.cond, vector, count);
|
||||||
{
|
|
||||||
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);
|
|
||||||
c->out.request_written = c->out.request;
|
c->out.request_written = c->out.request;
|
||||||
pthread_cond_broadcast(&c->out.cond);
|
pthread_cond_broadcast(&c->out.cond);
|
||||||
return ret;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -63,8 +63,6 @@ typedef struct _xcb_out {
|
||||||
|
|
||||||
char queue[4096];
|
char queue[4096];
|
||||||
int queue_len;
|
int queue_len;
|
||||||
struct iovec *vec;
|
|
||||||
int vec_len;
|
|
||||||
|
|
||||||
unsigned int request;
|
unsigned int request;
|
||||||
unsigned int request_written;
|
unsigned int request_written;
|
||||||
|
@ -77,8 +75,8 @@ int _xcb_out_init(_xcb_out *out);
|
||||||
void _xcb_out_destroy(_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(XCBConnection *c, struct iovec **vector, int *count);
|
||||||
int _xcb_out_write_block(XCBConnection *c, struct iovec *vector, size_t count);
|
int _xcb_out_send(XCBConnection *c, struct iovec **vector, int *count);
|
||||||
int _xcb_out_flush(XCBConnection *c);
|
int _xcb_out_flush_to(XCBConnection *c, unsigned int request);
|
||||||
|
|
||||||
|
|
||||||
/* xcb_in.c */
|
/* xcb_in.c */
|
||||||
|
|
Loading…
Reference in New Issue