mirror of
https://github.com/GOSTSec/sgminer
synced 2025-01-23 04:54:26 +00:00
Create a wakeup thread that keeps the hashmeter going in case the mining threads all stall.
This commit is contained in:
parent
ddae5aa9d0
commit
719deb3aac
37
main.c
37
main.c
@ -631,16 +631,24 @@ static void hashmeter(int thr_id, struct timeval *diff,
|
||||
static double local_mhashes_done = 0;
|
||||
static double rolling_local = 0;
|
||||
double local_mhashes = (double)hashes_done / 1000000.0;
|
||||
struct cgpu_info *cgpu = thr_info[thr_id].cgpu;
|
||||
|
||||
/* Don't bother calculating anything if we're not displaying it */
|
||||
if (opt_quiet || !opt_log_interval)
|
||||
return;
|
||||
|
||||
khashes = hashes_done / 1000.0;
|
||||
secs = (double)diff->tv_sec + ((double)diff->tv_usec / 1000000.0);
|
||||
|
||||
if (thr_id >= 0) {
|
||||
/* So we can call hashmeter from a non worker thread */
|
||||
struct cgpu_info *cgpu = thr_info[thr_id].cgpu;
|
||||
|
||||
if (opt_debug)
|
||||
applog(LOG_DEBUG, "[thread %d: %lu hashes, %.0f khash/sec]",
|
||||
thr_id, hashes_done, hashes_done / secs);
|
||||
cgpu->local_mhashes += local_mhashes;
|
||||
cgpu->total_mhashes += local_mhashes;
|
||||
}
|
||||
|
||||
/* Totals are updated by all threads so can race without locking */
|
||||
pthread_mutex_lock(&hash_lock);
|
||||
@ -650,8 +658,6 @@ static void hashmeter(int thr_id, struct timeval *diff,
|
||||
|
||||
total_mhashes_done += local_mhashes;
|
||||
local_mhashes_done += local_mhashes;
|
||||
cgpu->local_mhashes += local_mhashes;
|
||||
cgpu->total_mhashes += local_mhashes;
|
||||
if (total_diff.tv_sec < opt_log_interval)
|
||||
/* Only update the total every opt_log_interval seconds */
|
||||
goto out_unlock;
|
||||
@ -1300,6 +1306,22 @@ out:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Makes sure the hashmeter keeps going even if mining threads stall */
|
||||
static void *wakeup_thread(void *userdata)
|
||||
{
|
||||
const unsigned int interval = opt_log_interval / 2 ? : 1;
|
||||
struct timeval zero_tv;
|
||||
|
||||
memset(&zero_tv, 0, sizeof(struct timeval));
|
||||
|
||||
while (1) {
|
||||
sleep(interval);
|
||||
hashmeter(-1, &zero_tv, 0);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void show_usage(void)
|
||||
{
|
||||
int i;
|
||||
@ -1586,7 +1608,7 @@ int main (int argc, char *argv[])
|
||||
if (!work_restart)
|
||||
return 1;
|
||||
|
||||
thr_info = calloc(opt_n_threads + 2 + gpu_threads, sizeof(*thr));
|
||||
thr_info = calloc(opt_n_threads + 3 + gpu_threads, sizeof(*thr));
|
||||
if (!thr_info)
|
||||
return 1;
|
||||
|
||||
@ -1711,6 +1733,13 @@ int main (int argc, char *argv[])
|
||||
opt_n_threads,
|
||||
algo_names[opt_algo]);
|
||||
|
||||
thr = &thr_info[opt_n_threads + gpu_threads + 2];
|
||||
/* start wakeup thread */
|
||||
if (pthread_create(&thr->pth, NULL, wakeup_thread, NULL)) {
|
||||
applog(LOG_ERR, "wakeup thread create failed");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Restart count as it will be wrong till all threads are started */
|
||||
pthread_mutex_lock(&hash_lock);
|
||||
gettimeofday(&total_tv_start, NULL);
|
||||
|
Loading…
x
Reference in New Issue
Block a user