Browse Source

Bugfix: Save start time for stats to correct "Elapsed" key on "stats" RPC request

Conflicts:
	deviceapi.c

Conflicts:
	deviceapi.c
Luke Dashjr 12 years ago
parent
commit
665f295916
3 changed files with 29 additions and 1 deletions
  1. 3 1
      api.c
  2. 23 0
      miner.c
  3. 3 0
      miner.h

+ 3 - 1
api.c

@@ -2755,10 +2755,12 @@ static int itemstats(struct io_data *io_data, int i, char *id, struct cgminer_st
 {
 	struct api_data *root = NULL;
 	char buf[TMPBUFSIZ];
+	double elapsed;
 
 	root = api_add_int(root, "STATS", &i, false);
 	root = api_add_string(root, "ID", id, false);
-	root = api_add_elapsed(root, "Elapsed", &(total_secs), false);
+	elapsed = stats_elapsed(stats);
+	root = api_add_elapsed(root, "Elapsed", &elapsed, false);
 	root = api_add_uint32(root, "Calls", &(stats->getwork_calls), false);
 	root = api_add_timeval(root, "Wait", &(stats->getwork_wait), false);
 	root = api_add_timeval(root, "Max", &(stats->getwork_wait_max), false);

+ 23 - 0
miner.c

@@ -466,6 +466,8 @@ struct pool *add_pool(void)
 
 	/* Make sure the pool doesn't think we've been idle since time 0 */
 	pool->tv_idle.tv_sec = ~0UL;
+	
+	gettimeofday(&pool->cgminer_stats.start_tv, NULL);
 
 	pool->rpc_proxy = NULL;
 
@@ -2015,6 +2017,24 @@ void tailsprintf(char *f, const char *fmt, ...)
 	va_end(ap);
 }
 
+double stats_elapsed(struct cgminer_stats *stats)
+{
+	struct timeval now;
+	double elapsed;
+
+	if (stats->start_tv.tv_sec == 0)
+		elapsed = total_secs;
+	else {
+		gettimeofday(&now, NULL);
+		elapsed = tdiff(&now, &stats->start_tv);
+	}
+
+	if (elapsed < 1.0)
+		elapsed = 1.0;
+
+	return elapsed;
+}
+
 /* Convert a uint64_t value into a truncated string for displaying with its
  * associated suitable for Mega, Giga etc. Buf array needs to be long enough */
 static void suffix_string(uint64_t val, char *buf, int sigdigits)
@@ -4911,6 +4931,7 @@ void zero_stats(void)
 		pool->diff_rejected = 0;
 		pool->diff_stale = 0;
 		pool->last_share_diff = 0;
+		pool->cgminer_stats.start_tv = total_tv_start;
 		pool->cgminer_stats.getwork_calls = 0;
 		pool->cgminer_stats.getwork_wait_min.tv_sec = MIN_SEC_UNSET;
 		pool->cgminer_stats.getwork_wait_max.tv_sec = 0;
@@ -4959,6 +4980,7 @@ void zero_stats(void)
 		cgpu->dev_thermal_cutoff_count = 0;
 		cgpu->dev_comms_error_count = 0;
 		cgpu->dev_throttle_count = 0;
+		cgpu->cgminer_stats.start_tv = total_tv_start;
 		cgpu->cgminer_stats.getwork_calls = 0;
 		cgpu->cgminer_stats.getwork_wait_min.tv_sec = MIN_SEC_UNSET;
 		cgpu->cgminer_stats.getwork_wait_max.tv_sec = 0;
@@ -6597,6 +6619,7 @@ void *miner_thread(void *userdata)
 
 	sdiff.tv_sec = sdiff.tv_usec = 0;
 	gettimeofday(&tv_lastupdate, NULL);
+	cgpu->cgminer_stats.start_tv = tv_lastupdate;
 
 	while (1) {
 		mythr->work_restart = false;

+ 3 - 0
miner.h

@@ -358,6 +358,8 @@ enum {
 };
 
 struct cgminer_stats {
+	struct timeval start_tv;
+	
 	uint32_t getwork_calls;
 	struct timeval getwork_wait;
 	struct timeval getwork_wait_max;
@@ -1084,6 +1086,7 @@ extern void wlog(const char *f, ...) FORMAT_SYNTAX_CHECK(printf, 1, 2);
 extern void wlogprint(const char *f, ...) FORMAT_SYNTAX_CHECK(printf, 1, 2);
 extern int curses_int(const char *query);
 extern char *curses_input(const char *query);
+extern double stats_elapsed(struct cgminer_stats *);
 extern void kill_work(void);
 extern int prioritize_pools(char *param, int *pid);
 extern void validate_pool_priorities(void);