mirror of
https://github.com/GOSTSec/sgminer
synced 2025-01-22 04:24:19 +00:00
After cancelling a thread (unless it's detached, but mining threads aren't), it is always necessary to join the thread so the system will release resources.
This also simplifies kill_mining a bit.
This commit is contained in:
parent
e33590f37d
commit
0bd7a9ff63
@ -1061,9 +1061,9 @@ select_cgpu:
|
||||
thr->rolling = thr->cgpu->rolling = 0;
|
||||
/* Reports the last time we tried to revive a sick GPU */
|
||||
cgtime(&thr->sick);
|
||||
if (!pthread_cancel(thr->pth)) {
|
||||
if (!pthread_kill(thr->pth, 0)) {
|
||||
applog(LOG_WARNING, "Thread %d still exists, killing it off", thr_id);
|
||||
pthread_join(thr->pth, NULL);
|
||||
cg_completion_timeout(&thr_info_cancel_join, thr, 5000);
|
||||
thr->cgpu->drv->thread_shutdown(thr);
|
||||
} else
|
||||
applog(LOG_WARNING, "Thread %d no longer exists", thr_id);
|
||||
|
16
sgminer.c
16
sgminer.c
@ -3310,7 +3310,7 @@ static void disable_curses(void)
|
||||
|
||||
static void kill_timeout(struct thr_info *thr)
|
||||
{
|
||||
cg_completion_timeout(&thr_info_cancel, thr, 1000);
|
||||
cg_completion_timeout(&thr_info_cancel_join, thr, 1000);
|
||||
}
|
||||
|
||||
static void kill_mining(void)
|
||||
@ -3322,21 +3322,9 @@ static void kill_mining(void)
|
||||
/* Kill the mining threads*/
|
||||
rd_lock(&mining_thr_lock);
|
||||
for (i = 0; i < mining_threads; i++) {
|
||||
pthread_t *pth = (pthread_t *) calloc(1, sizeof(pthread_t));
|
||||
|
||||
thr = mining_thr[i];
|
||||
if (thr && PTH(thr) != 0L)
|
||||
*pth = thr->pth;
|
||||
thr_info_cancel(thr);
|
||||
forcelog(LOG_DEBUG, "Waiting for thread %d to finish...", thr->id);
|
||||
#ifndef WIN32
|
||||
if (pth && *pth)
|
||||
pthread_join(*pth, NULL);
|
||||
#else
|
||||
if (pth && pth->p)
|
||||
pthread_join(*pth, NULL);
|
||||
#endif
|
||||
free(pth);
|
||||
thr_info_cancel_join(thr);
|
||||
}
|
||||
rd_unlock(&mining_thr_lock);
|
||||
}
|
||||
|
3
util.c
3
util.c
@ -825,13 +825,14 @@ int thr_info_create(struct thr_info *thr, pthread_attr_t *attr, void *(*start) (
|
||||
return pthread_create(&thr->pth, attr, start, arg);
|
||||
}
|
||||
|
||||
void thr_info_cancel(struct thr_info *thr)
|
||||
void thr_info_cancel_join(struct thr_info *thr)
|
||||
{
|
||||
if (!thr)
|
||||
return;
|
||||
|
||||
if (PTH(thr) != 0L) {
|
||||
pthread_cancel(thr->pth);
|
||||
pthread_join(thr->pth, NULL);
|
||||
PTH(thr) = 0L;
|
||||
}
|
||||
cgsem_destroy(&thr->sem);
|
||||
|
2
util.h
2
util.h
@ -107,7 +107,7 @@ struct pool;
|
||||
enum dev_reason;
|
||||
struct cgpu_info;
|
||||
int thr_info_create(struct thr_info *thr, pthread_attr_t *attr, void *(*start) (void *), void *arg);
|
||||
void thr_info_cancel(struct thr_info *thr);
|
||||
void thr_info_cancel_join(struct thr_info *thr);
|
||||
void cgtime(struct timeval *tv);
|
||||
void subtime(struct timeval *a, struct timeval *b);
|
||||
void addtime(struct timeval *a, struct timeval *b);
|
||||
|
Loading…
x
Reference in New Issue
Block a user