Browse Source

Handle interruptions to various select calls in util.c

port-ckolivas
Con Kolivas 11 years ago committed by Noel Maersk
parent
commit
6b246a59f3
  1. 13
      util.c
  2. 10
      util.h

13
util.c

@ -1258,11 +1258,14 @@ static enum send_ret __stratum_send(struct pool *pool, char *s, ssize_t len) @@ -1258,11 +1258,14 @@ static enum send_ret __stratum_send(struct pool *pool, char *s, ssize_t len)
struct timeval timeout = {1, 0};
ssize_t sent;
fd_set wd;
retry:
FD_ZERO(&wd);
FD_SET(sock, &wd);
if (select(sock + 1, NULL, &wd, NULL, &timeout) < 1)
if (select(sock + 1, NULL, &wd, NULL, &timeout) < 1) {
if (interrupted())
goto retry;
return SEND_SELECTFAIL;
}
#ifdef __APPLE__
sent = send(pool->sock, s + ssent, len, SO_NOSIGPIPE);
#elif WIN32
@ -2184,6 +2187,7 @@ static bool setup_stratum_socket(struct pool *pool) @@ -2184,6 +2187,7 @@ static bool setup_stratum_socket(struct pool *pool)
applog(LOG_DEBUG, "Failed sock connect");
continue;
}
retry:
FD_ZERO(&rw);
FD_SET(sockd, &rw);
selret = select(sockd + 1, NULL, &rw, NULL, &tv_timeout);
@ -2199,6 +2203,8 @@ static bool setup_stratum_socket(struct pool *pool) @@ -2199,6 +2203,8 @@ static bool setup_stratum_socket(struct pool *pool)
break;
}
}
if (selret < 0 && interrupted())
goto retry;
CLOSESOCKET(sockd);
applog(LOG_DEBUG, "Select timeout/failed connect");
continue;
@ -2619,6 +2625,7 @@ int _cgsem_mswait(cgsem_t *cgsem, int ms, const char *file, const char *func, co @@ -2619,6 +2625,7 @@ int _cgsem_mswait(cgsem_t *cgsem, int ms, const char *file, const char *func, co
fd_set rd;
char buf;
retry:
fd = cgsem->pipefd[0];
FD_ZERO(&rd);
FD_SET(fd, &rd);
@ -2631,6 +2638,8 @@ int _cgsem_mswait(cgsem_t *cgsem, int ms, const char *file, const char *func, co @@ -2631,6 +2638,8 @@ int _cgsem_mswait(cgsem_t *cgsem, int ms, const char *file, const char *func, co
}
if (likely(!ret))
return ETIMEDOUT;
if (interrupted())
goto retry;
quitfrom(1, file, func, line, "Failed to sem_timedwait errno=%d cgsem=0x%p", errno, cgsem);
/* We don't reach here */
return 0;

10
util.h

@ -24,6 +24,10 @@ @@ -24,6 +24,10 @@
{
return (errno == ETIMEDOUT);
}
static inline bool interrupted(void)
{
return (errno == EINTR);
}
#elif defined WIN32
#include <ws2tcpip.h>
#include <winsock2.h>
@ -43,7 +47,11 @@ @@ -43,7 +47,11 @@
}
static inline bool sock_timeout(void)
{
return (errno == WSAETIMEDOUT);
return (WSAGetLastError() == WSAETIMEDOUT);
}
static inline bool interrupted(void)
{
return (WSAGetLastError() == WSAEINTR);
}
#ifndef SHUT_RDWR
#define SHUT_RDWR SD_BOTH

Loading…
Cancel
Save