diff --git a/src/ckpool.c b/src/ckpool.c index 7f45025b..95e4a865 100644 --- a/src/ckpool.c +++ b/src/ckpool.c @@ -227,7 +227,6 @@ void empty_buffer(connsock_t *cs) * of the buffer for use on the next receive. */ int read_socket_line(connsock_t *cs, int timeout) { - tv_t tv_timeout = {timeout, 0}; char *eom = NULL; size_t buflen; int ret = -1; @@ -250,11 +249,7 @@ int read_socket_line(connsock_t *cs, int timeout) while (42) { char readbuf[PAGESIZE] = {}; - FD_ZERO(&rd); - FD_SET(cs->fd, &rd); - if (eom) - tv_timeout.tv_sec = tv_timeout.tv_usec = 0; - ret = select(cs->fd + 1, &rd, NULL, NULL, &tv_timeout); + wait_read_select(cs->fd, eom ? 0 : timeout); if (eom && !ret) break; if (ret < 1) { diff --git a/src/connector.c b/src/connector.c index ae0893ce..78123f1c 100644 --- a/src/connector.c +++ b/src/connector.c @@ -260,7 +260,9 @@ retry: cksleep_ms(100); goto retry; } - ret = poll(fds, nfds, 1000); + do { + ret = poll(fds, nfds, 1000); + } while (unlikely(ret < 0 && interrupted())); if (ret < 0) { LOGERR("Failed to poll in receiver"); goto out; @@ -308,7 +310,6 @@ void *sender(void *arg) while (42) { sender_send_t *sender_send; client_instance_t *client; - tv_t timeout_tv = {0, 0}; bool only_send = false; int ret, fd, ofs = 0; @@ -346,11 +347,7 @@ void *sender(void *arg) * ready to receive data from us, put the send back on the * list. */ if (!only_send) { - fd_set writefds; - - FD_ZERO(&writefds); - FD_SET(fd, &writefds); - ret = select(fd + 1, NULL, &writefds, NULL, &timeout_tv); + ret = wait_write_select(fd, 0); if (ret < 1) { LOGDEBUG("Client %d not ready for writes", client->id); diff --git a/src/libckpool.c b/src/libckpool.c index 74c1cf73..01dca0ac 100644 --- a/src/libckpool.c +++ b/src/libckpool.c @@ -411,19 +411,15 @@ int connect_socket(char *url, char *port) * we can connect to quickly. */ noblock_socket(sockd); if (connect(sockd, p->ai_addr, p->ai_addrlen) == -1) { - struct timeval tv_timeout = {5, 0}; int selret; - fd_set rw; if (!sock_connecting()) { close(sockd); LOGDEBUG("Failed sock connect"); continue; } - FD_ZERO(&rw); - FD_SET(sockd, &rw); - selret = select(sockd + 1, NULL, &rw, NULL, &tv_timeout); - if (selret > 0 && FD_ISSET(sockd, &rw)) { + selret = wait_write_select(sockd, 5); + if (selret > 0) { socklen_t len; int err, n; @@ -457,13 +453,9 @@ out: int write_socket(int fd, const void *buf, size_t nbyte) { - tv_t tv_timeout = {1, 0}; - fd_set writefds; int ret; - FD_ZERO(&writefds); - FD_SET(fd, &writefds); - ret = select(fd + 1, NULL, &writefds, NULL, &tv_timeout); + ret = wait_write_select(fd, 5); if (ret < 1) { if (!ret) LOGNOTICE("Select timed out in write_socket"); @@ -487,12 +479,8 @@ void empty_socket(int fd) do { char buf[PAGESIZE]; - tv_t timeout = {0, 0}; - fd_set rd; - FD_ZERO(&rd); - FD_SET(fd, &rd); - ret = select(fd + 1, &rd, NULL, NULL, &timeout); + ret = wait_read_select(fd, 0); if (ret > 0) { ret = recv(fd, buf, PAGESIZE - 1, 0); buf[ret] = 0; @@ -625,7 +613,9 @@ int wait_read_select(int sockd, int timeout) FD_ZERO(&readfs); FD_SET(sockd, &readfs); - ret = select(sockd + 1, &readfs, NULL, NULL, &tv_timeout); + do { + ret = select(sockd + 1, &readfs, NULL, NULL, &tv_timeout); + } while (unlikely(ret < 0 && interrupted())); return ret; } @@ -700,7 +690,9 @@ int wait_write_select(int sockd, int timeout) FD_ZERO(&writefds); FD_SET(sockd, &writefds); - ret = select(sockd + 1, NULL, &writefds, NULL, &tv_timeout); + do { + ret = select(sockd + 1, NULL, &writefds, NULL, &tv_timeout); + } while (unlikely(ret < 0 && interrupted())); return ret; }