mirror of
https://github.com/GOSTSec/sgminer
synced 2025-01-22 12:34:27 +00:00
Handle interruptions to various select calls in util.c
This commit is contained in:
parent
95ac0c4356
commit
6b246a59f3
13
util.c
13
util.c
@ -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)
|
||||
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)
|
||||
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
|
||||
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
|
||||
}
|
||||
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
10
util.h
@ -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 @@
|
||||
}
|
||||
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…
x
Reference in New Issue
Block a user