Commit e49bfbf2ecd161a8a53ec3c5f11fd52c4fb49bac

Znort 987 2011-08-18T12:17:10

Add per-device statics log output

diff --git a/main.c b/main.c
index 3d67d65..321279f 100644
--- a/main.c
+++ b/main.c
@@ -174,6 +174,7 @@ bool opt_debug = false;
 bool opt_protocol = false;
 static bool want_longpoll = true;
 static bool have_longpoll = false;
+static bool want_per_device_stats = false;
 bool use_syslog = false;
 static bool opt_quiet = false;
 static bool opt_realquiet = false;
@@ -1075,6 +1076,9 @@ static struct opt_table opt_config_table[] = {
 	OPT_WITH_ARG("--pass|-p",
 		     set_pass, NULL, &trpc_pass,
 		     "Password for bitcoin JSON-RPC server"),
+	OPT_WITHOUT_ARG("--per-device-stats",
+			opt_set_bool, &want_per_device_stats,
+			"Force verbose mode and output per-device statistics"),
 	OPT_WITHOUT_ARG("--protocol-dump|-P",
 			opt_set_bool, &opt_protocol,
 			"Verbose dump of protocol-level activities"),
@@ -2679,6 +2683,40 @@ static void hashmeter(int thr_id, struct timeval *diff,
 		}
 		decay_time(&cgpu->rolling, thread_rolling);
 		cgpu->total_mhashes += local_mhashes;
+
+		// If needed, output detailed, per-device stats
+		if (want_per_device_stats) {
+			struct timeval now;
+			struct timeval elapsed;
+			gettimeofday(&now, NULL);
+			timeval_subtract(&elapsed, &now, &thr->cgpu->last_message_tv);
+			if (opt_log_interval <= elapsed.tv_sec) {
+
+				thr->cgpu->last_message_tv = now;
+
+				sprintf(
+					statusline,
+					"[%sPU%d (%ds):%.1f  (avg):%.1f Mh/s] [Q:%d  A:%d  R:%d  HW:%d  E:%.0f%%  U:%.2f/m]",
+					thr->cgpu->is_gpu ? "G" : "C",
+					thr->cgpu->cpu_gpu,
+					opt_log_interval,
+					thr->cgpu->rolling,
+					thr->cgpu->total_mhashes / total_secs,
+					thr->cgpu->getworks,
+					thr->cgpu->accepted,
+					thr->cgpu->rejected,
+					thr->cgpu->hw_errors,
+					thr->cgpu->efficiency,
+					thr->cgpu->utility
+				);
+
+				if (!curses_active) {
+					printf("%s          \r", statusline);
+					fflush(stdout);
+				} else
+					applog(LOG_INFO, "%s", statusline);
+			}
+		}
 	}
 
 	/* Totals are updated by all threads so can race without locking */
@@ -2704,9 +2742,12 @@ static void hashmeter(int thr_id, struct timeval *diff,
 	utility = total_accepted / ( total_secs ? total_secs : 1 ) * 60;
 	efficiency = total_getworks ? total_accepted * 100.0 / total_getworks : 0.0;
 
-	sprintf(statusline, "[(%ds):%.1f  (avg):%.1f Mh/s] [Q:%d  A:%d  R:%d  HW:%d  E:%.0f%%  U:%.2f/m]",
+	sprintf(statusline, "[%s(%ds):%.1f  (avg):%.1f Mh/s] [Q:%d  A:%d  R:%d  HW:%d  E:%.0f%%  U:%.2f/m]",
+		want_per_device_stats ? "ALL " : "",
 		opt_log_interval, rolling, total_mhashes_done / total_secs,
 		total_getworks, total_accepted, total_rejected, hw_errors, efficiency, utility);
+
+
 	local_mhashes_done = 0;
 out_unlock:
 	mutex_unlock(&hash_lock);
@@ -4456,6 +4497,9 @@ int main (int argc, char *argv[])
 	if (argc != 1)
 		quit(1, "Unexpected extra commandline arguments");
 
+	if (want_per_device_stats)
+		opt_log_output = true;
+
 	if (0<=opt_bench_algo) {
 		double rate = bench_algo_stage3(opt_bench_algo);
 		if (!skip_to_bench) {
diff --git a/miner.h b/miner.h
index 910693c..d96ad7f 100644
--- a/miner.h
+++ b/miner.h
@@ -153,6 +153,7 @@ struct cgpu_info {
 	double utility;
 	enum alive status;
 	char init[40];
+	struct timeval last_message_tv;
 };
 
 struct thr_info {