X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fxcb_in.c;h=0c68208dd0510636f7a311008536dad41f3cbb61;hb=96e55444b9b9500420f9132a1ace720100a26398;hp=1d029afa94cc25203b79cf4834f831aa0c3934d8;hpb=c5b2e53abf0b113d4cc4105127cf848ee450aa98;p=free-sw%2Fxcb%2Flibxcb diff --git a/src/xcb_in.c b/src/xcb_in.c index 1d029af..0c68208 100644 --- a/src/xcb_in.c +++ b/src/xcb_in.c @@ -52,7 +52,8 @@ struct reply_list { }; typedef struct pending_reply { - unsigned int request; + unsigned int first_request; + unsigned int last_request; enum workarounds workaround; int flags; struct pending_reply *next; @@ -112,7 +113,7 @@ static int read_packet(xcb_connection_t *c) } while(c->in.pending_replies && - XCB_SEQUENCE_COMPARE (c->in.pending_replies->request, <=, c->in.request_completed)) + XCB_SEQUENCE_COMPARE (c->in.pending_replies->last_request, <=, c->in.request_completed)) { pending_reply *oldpend = c->in.pending_replies; c->in.pending_replies = oldpend->next; @@ -128,7 +129,9 @@ static int read_packet(xcb_connection_t *c) if(genrep.response_type == XCB_ERROR || genrep.response_type == XCB_REPLY) { pend = c->in.pending_replies; - if(pend && pend->request != c->in.request_read) + if(pend && + (XCB_SEQUENCE_COMPARE(c->in.request_read, <, pend->first_request) || + XCB_SEQUENCE_COMPARE(c->in.request_read, >, pend->last_request))) pend = 0; } @@ -191,6 +194,7 @@ static int read_packet(xcb_connection_t *c) if(!cur) { _xcb_conn_shutdown(c); + free(buf); return 0; } cur->reply = buf; @@ -340,7 +344,7 @@ void *xcb_wait_for_reply(xcb_connection_t *c, unsigned int request, xcb_generic_ if(c->has_error) return 0; - _xcb_lock_io(c); + pthread_mutex_lock(&c->iolock); /* If this request has not been written yet, write it. */ if(_xcb_out_flush_to(c, request)) @@ -380,7 +384,7 @@ void *xcb_wait_for_reply(xcb_connection_t *c, unsigned int request, xcb_generic_ } wake_up_next_reader(c); - _xcb_unlock_io(c); + pthread_mutex_unlock(&c->iolock); return ret; } @@ -395,9 +399,9 @@ int xcb_poll_for_reply(xcb_connection_t *c, unsigned int request, void **reply, return 1; /* would not block */ } assert(reply != 0); - _xcb_lock_io(c); + pthread_mutex_lock(&c->iolock); ret = poll_for_reply(c, request, reply, error); - _xcb_unlock_io(c); + pthread_mutex_unlock(&c->iolock); return ret; } @@ -406,14 +410,14 @@ xcb_generic_event_t *xcb_wait_for_event(xcb_connection_t *c) xcb_generic_event_t *ret; if(c->has_error) return 0; - _xcb_lock_io(c); + pthread_mutex_lock(&c->iolock); /* get_event returns 0 on empty list. */ while(!(ret = get_event(c))) if(!_xcb_conn_wait(c, &c->in.event_cond, 0, 0)) break; wake_up_next_reader(c); - _xcb_unlock_io(c); + pthread_mutex_unlock(&c->iolock); return ret; } @@ -422,12 +426,12 @@ xcb_generic_event_t *xcb_poll_for_event(xcb_connection_t *c) xcb_generic_event_t *ret = 0; if(!c->has_error) { - _xcb_lock_io(c); + pthread_mutex_lock(&c->iolock); /* FIXME: follow X meets Z architecture changes. */ ret = get_event(c); if(!ret && _xcb_in_read(c)) /* _xcb_in_read shuts down the connection on error */ ret = get_event(c); - _xcb_unlock_io(c); + pthread_mutex_unlock(&c->iolock); } return ret; } @@ -505,7 +509,7 @@ int _xcb_in_expect_reply(xcb_connection_t *c, unsigned int request, enum workaro _xcb_conn_shutdown(c); return 0; } - pend->request = request; + pend->first_request = pend->last_request = request; pend->workaround = workaround; pend->flags = flags; pend->next = 0;