Retry a select() if it returns with EINTR. Fixes IO errors in Xephyr, which is
often interrupted by timers.
This commit is contained in:
parent
66a88ed0e5
commit
8275ac3a4a
|
@ -253,7 +253,11 @@ int _xcb_conn_wait(XCBConnection *c, pthread_cond_t *cond, struct iovec **vector
|
|||
}
|
||||
|
||||
pthread_mutex_unlock(&c->iolock);
|
||||
ret = select(c->fd + 1, &rfds, &wfds, 0, 0) > 0;
|
||||
do {
|
||||
ret = select(c->fd + 1, &rfds, &wfds, 0, 0);
|
||||
} while (ret == -1 && errno == EINTR);
|
||||
if (ret < 0)
|
||||
ret = 0;
|
||||
pthread_mutex_lock(&c->iolock);
|
||||
|
||||
if(ret)
|
||||
|
|
|
@ -229,7 +229,9 @@ static int read_block(const int fd, void *buf, const size_t len)
|
|||
fd_set fds;
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(fd, &fds);
|
||||
ret = select(fd + 1, &fds, 0, 0, 0);
|
||||
do {
|
||||
ret = select(fd + 1, &fds, 0, 0, 0);
|
||||
} while (ret == -1 && errno == EINTR);
|
||||
}
|
||||
if(ret <= 0)
|
||||
return ret;
|
||||
|
|
Loading…
Reference in New Issue