X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fxcb_in.c;h=89b06ab7a8a5b41cf86a67f169427f01088ffb9d;hb=b83f18a4cc2303dfda59807d56e16bbc5c18b09d;hp=cacb22010e1b23f7d59df89ebc7064abd3d5a254;hpb=ed823bf65192a72f8c3060698c9bded9f77d49c2;p=free-sw%2Fxcb%2Flibxcb diff --git a/src/xcb_in.c b/src/xcb_in.c index cacb220..89b06ab 100644 --- a/src/xcb_in.c +++ b/src/xcb_in.c @@ -91,6 +91,8 @@ static int read_packet(XCBConnection *c) c->in.request_read = (lastread & 0xffff0000) | genrep.sequence; if(c->in.request_read < lastread) c->in.request_read += 0x10000; + if(c->in.request_read > c->in.request_expected) + c->in.request_expected = c->in.request_read; if(c->in.request_read != lastread) { @@ -133,7 +135,7 @@ static int read_packet(XCBConnection *c) length += genrep.length * 4; } - buf = malloc(length); + buf = malloc(length + (genrep.response_type == 1 ? 0 : sizeof(CARD32))); if(!buf) return 0; if(_xcb_in_read_block(c, buf, length) <= 0) @@ -141,6 +143,14 @@ static int read_packet(XCBConnection *c) free(buf); return 0; } + if(pend && (pend->flags & XCB_REQUEST_DISCARD_REPLY)) + { + free(buf); + return 1; + } + + if(genrep.response_type != 1) + ((XCBGenericEvent *) buf)->full_sequence = c->in.request_read; /* reply, or checked error */ if(genrep.response_type == 1 || (genrep.response_type == 0 && pend && (pend->flags & XCB_REQUEST_CHECKED))) @@ -235,12 +245,15 @@ void *XCBWaitForReply(XCBConnection *c, unsigned int request, XCBGenericError ** if(e) *e = 0; + /* If an error occurred when issuing the request, fail immediately. */ + if(!request) + return 0; + 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) @@ -255,7 +268,7 @@ void *XCBWaitForReply(XCBConnection *c, unsigned int request, XCBGenericError ** * wait for one. */ while(c->in.request_completed < request && !(c->in.request_read == request && c->in.current_reply)) - if(!_xcb_conn_wait(c, /*should_write*/ 0, &cond)) + if(!_xcb_conn_wait(c, &cond, 0, 0)) goto done; if(c->in.request_read != request) @@ -315,7 +328,7 @@ XCBGenericEvent *XCBWaitForEvent(XCBConnection *c) pthread_mutex_lock(&c->iolock); /* get_event returns 0 on empty list. */ while(!(ret = get_event(c))) - if(!_xcb_conn_wait(c, /*should_write*/ 0, &c->in.event_cond)) + if(!_xcb_conn_wait(c, &c->in.event_cond, 0, 0)) break; wake_up_next_reader(c);