mirror of
https://github.com/GOSTSec/sgminer
synced 2025-01-09 14:28:12 +00:00
Check for more interrupted conditions in util.c and handle them gracefully.
This commit is contained in:
parent
90cc93c6cc
commit
f7394ff165
20
util.c
20
util.c
@ -2596,19 +2596,24 @@ void _cgsem_post(cgsem_t *cgsem, const char *file, const char *func, const int l
|
|||||||
const char buf = 1;
|
const char buf = 1;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
retry:
|
||||||
ret = write(cgsem->pipefd[1], &buf, 1);
|
ret = write(cgsem->pipefd[1], &buf, 1);
|
||||||
if (unlikely(ret == 0))
|
if (unlikely(ret == 0))
|
||||||
applog(LOG_WARNING, "Failed to write errno=%d" IN_FMT_FFL, errno, file, func, line);
|
applog(LOG_WARNING, "Failed to write errno=%d" IN_FMT_FFL, errno, file, func, line);
|
||||||
|
else if (unlikely(ret < 0 && interrupted))
|
||||||
|
goto retry;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _cgsem_wait(cgsem_t *cgsem, const char *file, const char *func, const int line)
|
void _cgsem_wait(cgsem_t *cgsem, const char *file, const char *func, const int line)
|
||||||
{
|
{
|
||||||
char buf;
|
char buf;
|
||||||
int ret;
|
int ret;
|
||||||
|
retry:
|
||||||
ret = read(cgsem->pipefd[0], &buf, 1);
|
ret = read(cgsem->pipefd[0], &buf, 1);
|
||||||
if (unlikely(ret == 0))
|
if (unlikely(ret == 0))
|
||||||
applog(LOG_WARNING, "Failed to read errno=%d" IN_FMT_FFL, errno, file, func, line);
|
applog(LOG_WARNING, "Failed to read errno=%d" IN_FMT_FFL, errno, file, func, line);
|
||||||
|
else if (unlikely(ret < 0 && interrupted))
|
||||||
|
goto retry;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cgsem_destroy(cgsem_t *cgsem)
|
void cgsem_destroy(cgsem_t *cgsem)
|
||||||
@ -2661,6 +2666,8 @@ void cgsem_reset(cgsem_t *cgsem)
|
|||||||
ret = select(fd + 1, &rd, NULL, NULL, &timeout);
|
ret = select(fd + 1, &rd, NULL, NULL, &timeout);
|
||||||
if (ret > 0)
|
if (ret > 0)
|
||||||
ret = read(fd, &buf, 1);
|
ret = read(fd, &buf, 1);
|
||||||
|
else if (unlikely(ret < 0 && interrupted()))
|
||||||
|
ret = 1;
|
||||||
} while (ret > 0);
|
} while (ret > 0);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@ -2679,8 +2686,12 @@ void _cgsem_post(cgsem_t *cgsem, const char *file, const char *func, const int l
|
|||||||
|
|
||||||
void _cgsem_wait(cgsem_t *cgsem, const char *file, const char *func, const int line)
|
void _cgsem_wait(cgsem_t *cgsem, const char *file, const char *func, const int line)
|
||||||
{
|
{
|
||||||
if (unlikely(sem_wait(cgsem)))
|
retry:
|
||||||
|
if (unlikely(sem_wait(cgsem))) {
|
||||||
|
if (interrupted())
|
||||||
|
goto retry;
|
||||||
quitfrom(1, file, func, line, "Failed to sem_wait errno=%d cgsem=0x%p", errno, cgsem);
|
quitfrom(1, file, func, line, "Failed to sem_wait errno=%d cgsem=0x%p", errno, cgsem);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int _cgsem_mswait(cgsem_t *cgsem, int ms, const char *file, const char *func, const int line)
|
int _cgsem_mswait(cgsem_t *cgsem, int ms, const char *file, const char *func, const int line)
|
||||||
@ -2692,12 +2703,15 @@ int _cgsem_mswait(cgsem_t *cgsem, int ms, const char *file, const char *func, co
|
|||||||
cgtime(&tv_now);
|
cgtime(&tv_now);
|
||||||
timeval_to_spec(&ts_now, &tv_now);
|
timeval_to_spec(&ts_now, &tv_now);
|
||||||
ms_to_timespec(&abs_timeout, ms);
|
ms_to_timespec(&abs_timeout, ms);
|
||||||
|
retry:
|
||||||
timeraddspec(&abs_timeout, &ts_now);
|
timeraddspec(&abs_timeout, &ts_now);
|
||||||
ret = sem_timedwait(cgsem, &abs_timeout);
|
ret = sem_timedwait(cgsem, &abs_timeout);
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (likely(sock_timeout()))
|
if (likely(sock_timeout()))
|
||||||
return ETIMEDOUT;
|
return ETIMEDOUT;
|
||||||
|
if (interrupted())
|
||||||
|
goto retry;
|
||||||
quitfrom(1, file, func, line, "Failed to sem_timedwait errno=%d cgsem=0x%p", errno, cgsem);
|
quitfrom(1, file, func, line, "Failed to sem_timedwait errno=%d cgsem=0x%p", errno, cgsem);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -2709,6 +2723,8 @@ void cgsem_reset(cgsem_t *cgsem)
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
ret = sem_trywait(cgsem);
|
ret = sem_trywait(cgsem);
|
||||||
|
if (unlikely(ret < 0 && interrupted()))
|
||||||
|
ret = 0;
|
||||||
} while (!ret);
|
} while (!ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user