Browse Source

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.
djm34
Jan Berdajs 10 years ago
parent
commit
0bd7a9ff63
  1. 4
      driver-opencl.c
  2. 16
      sgminer.c
  3. 3
      util.c
  4. 2
      util.h

4
driver-opencl.c

@ -1061,9 +1061,9 @@ select_cgpu:
thr->rolling = thr->cgpu->rolling = 0; thr->rolling = thr->cgpu->rolling = 0;
/* Reports the last time we tried to revive a sick GPU */ /* Reports the last time we tried to revive a sick GPU */
cgtime(&thr->sick); 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); 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); thr->cgpu->drv->thread_shutdown(thr);
} else } else
applog(LOG_WARNING, "Thread %d no longer exists", thr_id); applog(LOG_WARNING, "Thread %d no longer exists", thr_id);

16
sgminer.c

@ -3310,7 +3310,7 @@ static void disable_curses(void)
static void kill_timeout(struct thr_info *thr) 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) static void kill_mining(void)
@ -3322,21 +3322,9 @@ static void kill_mining(void)
/* Kill the mining threads*/ /* Kill the mining threads*/
rd_lock(&mining_thr_lock); rd_lock(&mining_thr_lock);
for (i = 0; i < mining_threads; i++) { for (i = 0; i < mining_threads; i++) {
pthread_t *pth = (pthread_t *) calloc(1, sizeof(pthread_t));
thr = mining_thr[i]; 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); forcelog(LOG_DEBUG, "Waiting for thread %d to finish...", thr->id);
#ifndef WIN32 thr_info_cancel_join(thr);
if (pth && *pth)
pthread_join(*pth, NULL);
#else
if (pth && pth->p)
pthread_join(*pth, NULL);
#endif
free(pth);
} }
rd_unlock(&mining_thr_lock); rd_unlock(&mining_thr_lock);
} }

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); 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) if (!thr)
return; return;
if (PTH(thr) != 0L) { if (PTH(thr) != 0L) {
pthread_cancel(thr->pth); pthread_cancel(thr->pth);
pthread_join(thr->pth, NULL);
PTH(thr) = 0L; PTH(thr) = 0L;
} }
cgsem_destroy(&thr->sem); cgsem_destroy(&thr->sem);

2
util.h

@ -107,7 +107,7 @@ struct pool;
enum dev_reason; enum dev_reason;
struct cgpu_info; struct cgpu_info;
int thr_info_create(struct thr_info *thr, pthread_attr_t *attr, void *(*start) (void *), void *arg); 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 cgtime(struct timeval *tv);
void subtime(struct timeval *a, struct timeval *b); void subtime(struct timeval *a, struct timeval *b);
void addtime(struct timeval *a, struct timeval *b); void addtime(struct timeval *a, struct timeval *b);

Loading…
Cancel
Save