Browse Source

Handle signal interruptions on all poll and select calls

master
ckolivas 11 years ago
parent
commit
b6e9d18bfc
  1. 7
      src/ckpool.c
  2. 11
      src/connector.c
  3. 28
      src/libckpool.c

7
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) {

11
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);

28
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;
}

Loading…
Cancel
Save