Factor reader_list management out of wait_for_reply.
Later patches will insert reader_list entries from other entry points. Signed-off-by: Jamey Sharp <jamey@minilop.net> Reviewed-by: Josh Triplett <josh@freedesktop.org>
This commit is contained in:
parent
1469e87965
commit
131e867fca
45
src/xcb_in.c
45
src/xcb_in.c
|
@ -356,6 +356,26 @@ static int poll_for_reply(xcb_connection_t *c, uint64_t request, void **reply, x
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void insert_reader(reader_list **prev_reader, reader_list *reader, uint64_t request, pthread_cond_t *cond)
|
||||||
|
{
|
||||||
|
while(*prev_reader && XCB_SEQUENCE_COMPARE((*prev_reader)->request, <=, request))
|
||||||
|
prev_reader = &(*prev_reader)->next;
|
||||||
|
reader->request = request;
|
||||||
|
reader->data = cond;
|
||||||
|
reader->next = *prev_reader;
|
||||||
|
*prev_reader = reader;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void remove_reader(reader_list **prev_reader, reader_list *reader)
|
||||||
|
{
|
||||||
|
while(*prev_reader && XCB_SEQUENCE_COMPARE((*prev_reader)->request, <=, reader->request))
|
||||||
|
if(*prev_reader == reader)
|
||||||
|
{
|
||||||
|
*prev_reader = (*prev_reader)->next;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void *wait_for_reply(xcb_connection_t *c, uint64_t request, xcb_generic_error_t **e)
|
static void *wait_for_reply(xcb_connection_t *c, uint64_t request, xcb_generic_error_t **e)
|
||||||
{
|
{
|
||||||
void *ret = 0;
|
void *ret = 0;
|
||||||
|
@ -365,35 +385,14 @@ static void *wait_for_reply(xcb_connection_t *c, uint64_t request, xcb_generic_e
|
||||||
{
|
{
|
||||||
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
|
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
|
||||||
reader_list reader;
|
reader_list reader;
|
||||||
reader_list **prev_reader;
|
|
||||||
|
|
||||||
for(prev_reader = &c->in.readers;
|
insert_reader(&c->in.readers, &reader, request, &cond);
|
||||||
*prev_reader &&
|
|
||||||
XCB_SEQUENCE_COMPARE((*prev_reader)->request, <=, request);
|
|
||||||
prev_reader = &(*prev_reader)->next)
|
|
||||||
{
|
|
||||||
/* empty */;
|
|
||||||
}
|
|
||||||
reader.request = request;
|
|
||||||
reader.data = &cond;
|
|
||||||
reader.next = *prev_reader;
|
|
||||||
*prev_reader = &reader;
|
|
||||||
|
|
||||||
while(!poll_for_reply(c, request, &ret, e))
|
while(!poll_for_reply(c, request, &ret, e))
|
||||||
if(!_xcb_conn_wait(c, &cond, 0, 0))
|
if(!_xcb_conn_wait(c, &cond, 0, 0))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
for(prev_reader = &c->in.readers;
|
remove_reader(&c->in.readers, &reader);
|
||||||
*prev_reader &&
|
|
||||||
XCB_SEQUENCE_COMPARE((*prev_reader)->request, <=, request);
|
|
||||||
prev_reader = &(*prev_reader)->next)
|
|
||||||
{
|
|
||||||
if(*prev_reader == &reader)
|
|
||||||
{
|
|
||||||
*prev_reader = (*prev_reader)->next;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pthread_cond_destroy(&cond);
|
pthread_cond_destroy(&cond);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue