Browse Source

Create a wakeup thread that keeps the hashmeter going in case the mining threads all stall.

nfactor-troky
Con Kolivas 14 years ago
parent
commit
719deb3aac
  1. 43
      main.c

43
main.c

@ -631,16 +631,24 @@ static void hashmeter(int thr_id, struct timeval *diff, @@ -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 (opt_debug)
applog(LOG_DEBUG, "[thread %d: %lu hashes, %.0f khash/sec]",
thr_id, hashes_done, hashes_done / secs);
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, @@ -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: @@ -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[]) @@ -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[]) @@ -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…
Cancel
Save