|
|
|
@ -998,6 +998,11 @@ static void workio_cmd_free(struct workio_cmd *wc)
@@ -998,6 +998,11 @@ static void workio_cmd_free(struct workio_cmd *wc)
|
|
|
|
|
static void disable_curses(void) |
|
|
|
|
{ |
|
|
|
|
if (test_and_clear(&curses_active)) { |
|
|
|
|
#ifdef WIN32 |
|
|
|
|
leaveok(logwin, false); |
|
|
|
|
leaveok(statuswin, false); |
|
|
|
|
leaveok(mainwin, false); |
|
|
|
|
#endif |
|
|
|
|
nocbreak(); |
|
|
|
|
echo(); |
|
|
|
|
delwin(logwin); |
|
|
|
@ -1005,6 +1010,19 @@ static void disable_curses(void)
@@ -1005,6 +1010,19 @@ static void disable_curses(void)
|
|
|
|
|
delwin(mainwin); |
|
|
|
|
endwin(); |
|
|
|
|
refresh(); |
|
|
|
|
|
|
|
|
|
#ifdef WIN32 |
|
|
|
|
// Move the cursor to after curses output.
|
|
|
|
|
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE); |
|
|
|
|
CONSOLE_SCREEN_BUFFER_INFO csbi; |
|
|
|
|
COORD coord; |
|
|
|
|
|
|
|
|
|
if (GetConsoleScreenBufferInfo(hout, &csbi)) { |
|
|
|
|
coord.X = 0; |
|
|
|
|
coord.Y = csbi.dwSize.Y - 1; |
|
|
|
|
SetConsoleCursorPosition(hout, coord); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1019,7 +1037,7 @@ void kill_work(void)
@@ -1019,7 +1037,7 @@ void kill_work(void)
|
|
|
|
|
|
|
|
|
|
/* Kill the watchdog thread */ |
|
|
|
|
thr = &thr_info[watchdog_thr_id]; |
|
|
|
|
pthread_cancel(thr->pth); |
|
|
|
|
pthread_cancel(*thr->pth); |
|
|
|
|
|
|
|
|
|
/* Stop the mining threads*/ |
|
|
|
|
for (i = 0; i < mining_threads; i++) { |
|
|
|
@ -1028,14 +1046,14 @@ void kill_work(void)
@@ -1028,14 +1046,14 @@ void kill_work(void)
|
|
|
|
|
continue; |
|
|
|
|
tq_freeze(thr->q); |
|
|
|
|
/* No need to check if this succeeds or not */ |
|
|
|
|
pthread_cancel(thr->pth); |
|
|
|
|
pthread_cancel(*thr->pth); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Stop the others */ |
|
|
|
|
thr = &thr_info[stage_thr_id]; |
|
|
|
|
pthread_cancel(thr->pth); |
|
|
|
|
pthread_cancel(*thr->pth); |
|
|
|
|
thr = &thr_info[longpoll_thr_id]; |
|
|
|
|
pthread_cancel(thr->pth); |
|
|
|
|
pthread_cancel(*thr->pth); |
|
|
|
|
|
|
|
|
|
wc = calloc(1, sizeof(*wc)); |
|
|
|
|
if (unlikely(!wc)) { |
|
|
|
@ -2805,7 +2823,7 @@ static void stop_longpoll(void)
@@ -2805,7 +2823,7 @@ static void stop_longpoll(void)
|
|
|
|
|
struct thr_info *thr = &thr_info[longpoll_thr_id]; |
|
|
|
|
|
|
|
|
|
tq_freeze(thr->q); |
|
|
|
|
pthread_cancel(thr->pth); |
|
|
|
|
pthread_cancel(*thr->pth); |
|
|
|
|
have_longpoll = false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -2816,9 +2834,9 @@ static void start_longpoll(void)
@@ -2816,9 +2834,9 @@ static void start_longpoll(void)
|
|
|
|
|
struct thr_info *thr = &thr_info[longpoll_thr_id]; |
|
|
|
|
|
|
|
|
|
tq_thaw(thr->q); |
|
|
|
|
if (unlikely(pthread_create(&thr->pth, NULL, longpoll_thread, thr))) |
|
|
|
|
if (unlikely(thr_info_create(thr, NULL, longpoll_thread, thr))) |
|
|
|
|
quit(1, "longpoll thread create failed"); |
|
|
|
|
pthread_detach(thr->pth); |
|
|
|
|
pthread_detach(*thr->pth); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void restart_longpoll(void) |
|
|
|
@ -2833,7 +2851,7 @@ static void reinit_cputhread(int thr_id)
@@ -2833,7 +2851,7 @@ static void reinit_cputhread(int thr_id)
|
|
|
|
|
struct thr_info *thr = &thr_info[thr_id]; |
|
|
|
|
|
|
|
|
|
tq_freeze(thr->q); |
|
|
|
|
if (!(pthread_cancel(thr->pth)) && pthread_join(thr->pth, NULL)) { |
|
|
|
|
if (!(pthread_cancel(*thr->pth)) && pthread_join(*thr->pth, NULL)) { |
|
|
|
|
applog(LOG_ERR, "Failed to pthread_join in reinit_cputhread"); |
|
|
|
|
goto failed_out; |
|
|
|
|
} |
|
|
|
@ -2843,7 +2861,7 @@ static void reinit_cputhread(int thr_id)
@@ -2843,7 +2861,7 @@ static void reinit_cputhread(int thr_id)
|
|
|
|
|
|
|
|
|
|
thread_reportin(thr); |
|
|
|
|
|
|
|
|
|
if (unlikely(pthread_create(&thr->pth, NULL, miner_thread, thr))) { |
|
|
|
|
if (unlikely(thr_info_create(thr, NULL, miner_thread, thr))) { |
|
|
|
|
applog(LOG_ERR, "thread %d create failed", thr_id); |
|
|
|
|
goto failed_out; |
|
|
|
|
} |
|
|
|
@ -2861,7 +2879,7 @@ static void reinit_gputhread(int thr_id)
@@ -2861,7 +2879,7 @@ static void reinit_gputhread(int thr_id)
|
|
|
|
|
char name[256]; |
|
|
|
|
|
|
|
|
|
tq_freeze(thr->q); |
|
|
|
|
if (!(pthread_cancel(thr->pth)) && pthread_join(thr->pth, NULL)) { |
|
|
|
|
if (!(pthread_cancel(*thr->pth)) && pthread_join(*thr->pth, NULL)) { |
|
|
|
|
applog(LOG_ERR, "Failed to pthread_join in reinit_gputhread"); |
|
|
|
|
goto failed_out; |
|
|
|
|
} |
|
|
|
@ -2878,7 +2896,7 @@ static void reinit_gputhread(int thr_id)
@@ -2878,7 +2896,7 @@ static void reinit_gputhread(int thr_id)
|
|
|
|
|
|
|
|
|
|
thread_reportin(thr); |
|
|
|
|
|
|
|
|
|
if (unlikely(pthread_create(&thr->pth, NULL, gpuminer_thread, thr))) { |
|
|
|
|
if (unlikely(thr_info_create(thr, NULL, gpuminer_thread, thr))) { |
|
|
|
|
applog(LOG_ERR, "thread %d create failed", thr_id); |
|
|
|
|
goto failed_out; |
|
|
|
|
} |
|
|
|
@ -3351,7 +3369,7 @@ int main (int argc, char *argv[])
@@ -3351,7 +3369,7 @@ int main (int argc, char *argv[])
|
|
|
|
|
quit(1, "Failed to tq_new"); |
|
|
|
|
|
|
|
|
|
/* start work I/O thread */ |
|
|
|
|
if (pthread_create(&thr->pth, NULL, workio_thread, thr)) |
|
|
|
|
if (thr_info_create(thr, NULL, workio_thread, thr)) |
|
|
|
|
quit(1, "workio thread create failed"); |
|
|
|
|
|
|
|
|
|
/* init longpoll thread info */ |
|
|
|
@ -3382,9 +3400,9 @@ int main (int argc, char *argv[])
@@ -3382,9 +3400,9 @@ int main (int argc, char *argv[])
|
|
|
|
|
if (!thr->q) |
|
|
|
|
quit(1, "Failed to tq_new"); |
|
|
|
|
/* start stage thread */ |
|
|
|
|
if (pthread_create(&thr->pth, NULL, stage_thread, thr)) |
|
|
|
|
if (thr_info_create(thr, NULL, stage_thread, thr)) |
|
|
|
|
quit(1, "stage thread create failed"); |
|
|
|
|
pthread_detach(thr->pth); |
|
|
|
|
pthread_detach(*thr->pth); |
|
|
|
|
|
|
|
|
|
/* Create a unique get work queue */ |
|
|
|
|
getq = tq_new(); |
|
|
|
@ -3449,7 +3467,7 @@ int main (int argc, char *argv[])
@@ -3449,7 +3467,7 @@ int main (int argc, char *argv[])
|
|
|
|
|
|
|
|
|
|
thread_reportin(thr); |
|
|
|
|
|
|
|
|
|
if (unlikely(pthread_create(&thr->pth, NULL, gpuminer_thread, thr))) |
|
|
|
|
if (unlikely(thr_info_create(thr, NULL, gpuminer_thread, thr))) |
|
|
|
|
quit(1, "thread %d create failed", i); |
|
|
|
|
i++; |
|
|
|
|
} |
|
|
|
@ -3477,7 +3495,7 @@ int main (int argc, char *argv[])
@@ -3477,7 +3495,7 @@ int main (int argc, char *argv[])
|
|
|
|
|
|
|
|
|
|
thread_reportin(thr); |
|
|
|
|
|
|
|
|
|
if (unlikely(pthread_create(&thr->pth, NULL, miner_thread, thr))) |
|
|
|
|
if (unlikely(thr_info_create(thr, NULL, miner_thread, thr))) |
|
|
|
|
quit(1, "thread %d create failed", i); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -3489,7 +3507,7 @@ int main (int argc, char *argv[])
@@ -3489,7 +3507,7 @@ int main (int argc, char *argv[])
|
|
|
|
|
watchdog_thr_id = mining_threads + 2; |
|
|
|
|
thr = &thr_info[watchdog_thr_id]; |
|
|
|
|
/* start wakeup thread */ |
|
|
|
|
if (pthread_create(&thr->pth, NULL, watchdog_thread, NULL)) |
|
|
|
|
if (thr_info_create(thr, NULL, watchdog_thread, NULL)) |
|
|
|
|
quit(1, "wakeup thread create failed"); |
|
|
|
|
|
|
|
|
|
/* Now that everything's ready put enough work in the queue */ |
|
|
|
@ -3503,12 +3521,12 @@ int main (int argc, char *argv[])
@@ -3503,12 +3521,12 @@ int main (int argc, char *argv[])
|
|
|
|
|
/* Create curses input thread for keyboard input */ |
|
|
|
|
input_thr_id = mining_threads + 4; |
|
|
|
|
thr = &thr_info[input_thr_id]; |
|
|
|
|
if (pthread_create(&thr->pth, NULL, input_thread, thr)) |
|
|
|
|
if (thr_info_create(thr, NULL, input_thread, thr)) |
|
|
|
|
quit(1, "input thread create failed"); |
|
|
|
|
pthread_detach(thr->pth); |
|
|
|
|
pthread_detach(*thr->pth); |
|
|
|
|
|
|
|
|
|
/* main loop - simply wait for workio thread to exit */ |
|
|
|
|
pthread_join(thr_info[work_thr_id].pth, NULL); |
|
|
|
|
pthread_join(*thr_info[work_thr_id].pth, NULL); |
|
|
|
|
applog(LOG_INFO, "workio thread dead, exiting."); |
|
|
|
|
|
|
|
|
|
gettimeofday(&total_tv_end, NULL); |
|
|
|
|