|
|
|
@ -3149,6 +3149,35 @@ static void disable_curses(void)
@@ -3149,6 +3149,35 @@ static void disable_curses(void)
|
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
static void kill_timeout(struct thr_info *thr) |
|
|
|
|
{ |
|
|
|
|
cg_completion_timeout(&thr_info_cancel, thr, 1000); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void kill_mining(void) |
|
|
|
|
{ |
|
|
|
|
struct thr_info *thr; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Killing off mining threads"); |
|
|
|
|
/* Kill the mining threads*/ |
|
|
|
|
for (i = 0; i < mining_threads; i++) { |
|
|
|
|
pthread_t *pth = NULL; |
|
|
|
|
|
|
|
|
|
thr = get_thread(i); |
|
|
|
|
if (thr && PTH(thr) != 0L) |
|
|
|
|
pth = &thr->pth; |
|
|
|
|
thr_info_cancel(thr); |
|
|
|
|
#ifndef WIN32 |
|
|
|
|
if (pth && *pth) |
|
|
|
|
pthread_join(*pth, NULL); |
|
|
|
|
#else |
|
|
|
|
if (pth && pth->p) |
|
|
|
|
pthread_join(*pth, NULL); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void __kill_work(void) |
|
|
|
|
{ |
|
|
|
|
struct thr_info *thr; |
|
|
|
@ -3165,19 +3194,19 @@ static void __kill_work(void)
@@ -3165,19 +3194,19 @@ static void __kill_work(void)
|
|
|
|
|
if (!opt_scrypt) { |
|
|
|
|
applog(LOG_DEBUG, "Killing off HotPlug thread"); |
|
|
|
|
thr = &control_thr[hotplug_thr_id]; |
|
|
|
|
thr_info_cancel(thr); |
|
|
|
|
kill_timeout(thr); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Killing off watchpool thread"); |
|
|
|
|
/* Kill the watchpool thread */ |
|
|
|
|
thr = &control_thr[watchpool_thr_id]; |
|
|
|
|
thr_info_cancel(thr); |
|
|
|
|
kill_timeout(thr); |
|
|
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Killing off watchdog thread"); |
|
|
|
|
/* Kill the watchdog thread */ |
|
|
|
|
thr = &control_thr[watchdog_thr_id]; |
|
|
|
|
thr_info_cancel(thr); |
|
|
|
|
kill_timeout(thr); |
|
|
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Shutting down mining threads"); |
|
|
|
|
for (i = 0; i < mining_threads; i++) { |
|
|
|
@ -3195,43 +3224,27 @@ static void __kill_work(void)
@@ -3195,43 +3224,27 @@ static void __kill_work(void)
|
|
|
|
|
|
|
|
|
|
sleep(1); |
|
|
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Killing off mining threads"); |
|
|
|
|
/* Kill the mining threads*/ |
|
|
|
|
for (i = 0; i < mining_threads; i++) { |
|
|
|
|
pthread_t *pth = NULL; |
|
|
|
|
|
|
|
|
|
thr = get_thread(i); |
|
|
|
|
if (thr && PTH(thr) != 0L) |
|
|
|
|
pth = &thr->pth; |
|
|
|
|
thr_info_cancel(thr); |
|
|
|
|
#ifndef WIN32 |
|
|
|
|
if (pth && *pth) |
|
|
|
|
pthread_join(*pth, NULL); |
|
|
|
|
#else |
|
|
|
|
if (pth && pth->p) |
|
|
|
|
pthread_join(*pth, NULL); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
cg_completion_timeout(&kill_mining, NULL, 3000); |
|
|
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Killing off stage thread"); |
|
|
|
|
/* Stop the others */ |
|
|
|
|
thr = &control_thr[stage_thr_id]; |
|
|
|
|
thr_info_cancel(thr); |
|
|
|
|
kill_timeout(thr); |
|
|
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Killing off API thread"); |
|
|
|
|
thr = &control_thr[api_thr_id]; |
|
|
|
|
thr_info_cancel(thr); |
|
|
|
|
kill_timeout(thr); |
|
|
|
|
|
|
|
|
|
#ifdef USE_USBUTILS |
|
|
|
|
/* Release USB resources in case it's a restart
|
|
|
|
|
* and not a QUIT */ |
|
|
|
|
if (!opt_scrypt) { |
|
|
|
|
applog(LOG_DEBUG, "Releasing all USB devices"); |
|
|
|
|
usb_cleanup(); |
|
|
|
|
cg_completion_timeout(&usb_cleanup, NULL, 1000); |
|
|
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Killing off usbres thread"); |
|
|
|
|
thr = &control_thr[usbres_thr_id]; |
|
|
|
|
thr_info_cancel(thr); |
|
|
|
|
kill_timeout(thr); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|