mirror of
https://github.com/GOSTSec/sgminer
synced 2025-01-11 07:17:58 +00:00
fix segfault (watchdog thread declares threads sick and tries to restart them while they are already being restarted)
This commit is contained in:
parent
a5bec2b999
commit
00d17d16fe
23
sgminer.c
23
sgminer.c
@ -7412,6 +7412,8 @@ static void *watchdog_thread(void __maybe_unused *userdata)
|
|||||||
|
|
||||||
hashmeter(-1, &zero_tv, 0);
|
hashmeter(-1, &zero_tv, 0);
|
||||||
|
|
||||||
|
rd_lock(&mining_thr_lock);
|
||||||
|
|
||||||
#ifdef HAVE_CURSES
|
#ifdef HAVE_CURSES
|
||||||
if (curses_active_locked()) {
|
if (curses_active_locked()) {
|
||||||
struct cgpu_info *cgpu;
|
struct cgpu_info *cgpu;
|
||||||
@ -7547,6 +7549,7 @@ static void *watchdog_thread(void __maybe_unused *userdata)
|
|||||||
reinit_device(cgpu);
|
reinit_device(cgpu);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
rd_unlock(&mining_thr_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -8122,6 +8125,10 @@ static void restart_mining_threads(unsigned int new_n_threads)
|
|||||||
thr->cgpu->drv->thread_shutdown(thr);
|
thr->cgpu->drv->thread_shutdown(thr);
|
||||||
thr->cgpu->shutdown = false;
|
thr->cgpu->shutdown = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rd_lock(&mining_thr_lock);
|
||||||
|
if (mining_thr) {
|
||||||
for (i = 0; i < total_devices; ++i) {
|
for (i = 0; i < total_devices; ++i) {
|
||||||
free(devices[i]->thr);
|
free(devices[i]->thr);
|
||||||
}
|
}
|
||||||
@ -8159,14 +8166,26 @@ static void restart_mining_threads(unsigned int new_n_threads)
|
|||||||
thr->cgpu = cgpu;
|
thr->cgpu = cgpu;
|
||||||
thr->device_thread = j;
|
thr->device_thread = j;
|
||||||
|
|
||||||
|
cgtime(&thr->last);
|
||||||
|
|
||||||
|
cgpu->thr[j] = thr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rd_unlock(&mining_thr_lock);
|
||||||
|
|
||||||
|
for (i = 0; i < total_devices; ++i) {
|
||||||
|
struct cgpu_info *cgpu = devices[i];
|
||||||
|
|
||||||
|
for (j = 0; j < cgpu->threads; ++j) {
|
||||||
|
thr = cgpu->thr[j];
|
||||||
|
|
||||||
if (!cgpu->drv->thread_prepare(thr))
|
if (!cgpu->drv->thread_prepare(thr))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (unlikely(thr_info_create(thr, NULL, miner_thread, thr)))
|
if (unlikely(thr_info_create(thr, NULL, miner_thread, thr)))
|
||||||
quit(1, "thread %d create failed", thr->id);
|
quit(1, "thread %d create failed", thr->id);
|
||||||
|
|
||||||
cgpu->thr[j] = thr;
|
|
||||||
|
|
||||||
/* Enable threads for devices set not to mine but disable
|
/* Enable threads for devices set not to mine but disable
|
||||||
* their queue in case we wish to enable them later */
|
* their queue in case we wish to enable them later */
|
||||||
if (cgpu->deven != DEV_DISABLED) {
|
if (cgpu->deven != DEV_DISABLED) {
|
||||||
|
Loading…
Reference in New Issue
Block a user