X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fxcb_in.c;h=dc12fa27b3d418faf084fbd8a8f5c4f387acc0a2;hb=f27166f49b9ef6bdcce78429bffc724d1e4fb360;hp=4a62a48806d3ec53e7ac1d3c3aedfbca842cd89e;hpb=3f8d0bd5322749132626e8f203017b6da6448fd0;p=free-sw%2Fxcb%2Flibxcb diff --git a/src/xcb_in.c b/src/xcb_in.c index 4a62a48..dc12fa2 100644 --- a/src/xcb_in.c +++ b/src/xcb_in.c @@ -69,14 +69,6 @@ static void wake_up_next_reader(XCBConnection *c) assert(pthreadret == 0); } -static int readn(const int fd, void *buf, const int buflen, int *count) -{ - int n = read(fd, ((char *) buf) + *count, buflen - *count); - if(n > 0) - *count += n; - return n; -} - static int read_packet(XCBConnection *c) { XCBGenericRep genrep; @@ -161,6 +153,27 @@ static int read_packet(XCBConnection *c) return 1; /* I have something for you... */ } +static int read_block(const int fd, void *buf, const size_t len) +{ + int done = 0; + while(done < len) + { + int ret = read(fd, ((char *) buf) + done, len - done); + if(ret > 0) + done += ret; + if(ret < 0 && errno == EAGAIN) + { + fd_set fds; + FD_ZERO(&fds); + FD_SET(fd, &fds); + ret = select(fd + 1, &fds, 0, 0, 0); + } + if(ret <= 0) + return ret; + } + return len; +} + /* Public interface */ void *XCBWaitForReply(XCBConnection *c, unsigned int request, XCBGenericError **e) @@ -336,7 +349,9 @@ int _xcb_in_expect_reply(XCBConnection *c, unsigned int request, enum workaround int _xcb_in_read(XCBConnection *c) { - int n = readn(c->fd, c->in.queue, sizeof(c->in.queue), &c->in.queue_len); + int n = read(c->fd, c->in.queue + c->in.queue_len, sizeof(c->in.queue) - c->in.queue_len); + if(n > 0) + c->in.queue_len += n; while(read_packet(c)) /* empty */; return (n > 0) || (n < 0 && errno == EAGAIN); @@ -354,7 +369,7 @@ int _xcb_in_read_block(XCBConnection *c, void *buf, int len) if(len > done) { - int ret = _xcb_read_block(c->fd, (char *) buf + done, len - done); + int ret = read_block(c->fd, (char *) buf + done, len - done); if(ret <= 0) return ret; }