Browse Source

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

Luke Dashjr 12 years ago
parent
commit
feb0144c01
4 changed files with 29 additions and 1 deletions
  1. 3 1
      api.c
  2. 1 0
      deviceapi.c
  3. 22 0
      miner.c
  4. 3 0
      miner.h

+ 3 - 1
api.c

@@ -2768,10 +2768,12 @@ static int itemstats(struct io_data *io_data, int i, char *id, struct cgminer_st
 {
 {
 	struct api_data *root = NULL;
 	struct api_data *root = NULL;
 	char buf[TMPBUFSIZ];
 	char buf[TMPBUFSIZ];
+	double elapsed;
 
 
 	root = api_add_int(root, "STATS", &i, false);
 	root = api_add_int(root, "STATS", &i, false);
 	root = api_add_string(root, "ID", id, 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_uint32(root, "Calls", &(stats->getwork_calls), false);
 	root = api_add_timeval(root, "Wait", &(stats->getwork_wait), false);
 	root = api_add_timeval(root, "Wait", &(stats->getwork_wait), false);
 	root = api_add_timeval(root, "Max", &(stats->getwork_wait_max), false);
 	root = api_add_timeval(root, "Max", &(stats->getwork_wait_max), false);

+ 1 - 0
deviceapi.c

@@ -574,6 +574,7 @@ void *miner_thread(void *userdata)
 	applog(LOG_DEBUG, "Popping ping in miner thread");
 	applog(LOG_DEBUG, "Popping ping in miner thread");
 	notifier_read(mythr->notifier);  // Wait for a notification to start
 	notifier_read(mythr->notifier);  // Wait for a notification to start
 
 
+	cgtime(&cgpu->cgminer_stats.start_tv);
 	if (drv->minerloop)
 	if (drv->minerloop)
 		drv->minerloop(mythr);
 		drv->minerloop(mythr);
 	else
 	else

+ 22 - 0
miner.c

@@ -513,6 +513,8 @@ struct pool *add_pool(void)
 
 
 	/* Make sure the pool doesn't think we've been idle since time 0 */
 	/* Make sure the pool doesn't think we've been idle since time 0 */
 	pool->tv_idle.tv_sec = ~0UL;
 	pool->tv_idle.tv_sec = ~0UL;
+	
+	cgtime(&pool->cgminer_stats.start_tv);
 
 
 	pool->rpc_proxy = NULL;
 	pool->rpc_proxy = NULL;
 
 
@@ -2188,6 +2190,24 @@ void tailsprintf(char *f, const char *fmt, ...)
 	va_end(ap);
 	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 {
+		cgtime(&now);
+		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
 /* 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 */
  * associated suitable for Mega, Giga etc. Buf array needs to be long enough */
 static void suffix_string(uint64_t val, char *buf, int sigdigits)
 static void suffix_string(uint64_t val, char *buf, int sigdigits)
@@ -5376,6 +5396,7 @@ void zero_stats(void)
 		pool->diff_rejected = 0;
 		pool->diff_rejected = 0;
 		pool->diff_stale = 0;
 		pool->diff_stale = 0;
 		pool->last_share_diff = 0;
 		pool->last_share_diff = 0;
+		pool->cgminer_stats.start_tv = total_tv_start;
 		pool->cgminer_stats.getwork_calls = 0;
 		pool->cgminer_stats.getwork_calls = 0;
 		pool->cgminer_stats.getwork_wait_min.tv_sec = MIN_SEC_UNSET;
 		pool->cgminer_stats.getwork_wait_min.tv_sec = MIN_SEC_UNSET;
 		pool->cgminer_stats.getwork_wait_max.tv_sec = 0;
 		pool->cgminer_stats.getwork_wait_max.tv_sec = 0;
@@ -5425,6 +5446,7 @@ void zero_stats(void)
 		cgpu->dev_thermal_cutoff_count = 0;
 		cgpu->dev_thermal_cutoff_count = 0;
 		cgpu->dev_comms_error_count = 0;
 		cgpu->dev_comms_error_count = 0;
 		cgpu->dev_throttle_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_calls = 0;
 		cgpu->cgminer_stats.getwork_wait_min.tv_sec = MIN_SEC_UNSET;
 		cgpu->cgminer_stats.getwork_wait_min.tv_sec = MIN_SEC_UNSET;
 		cgpu->cgminer_stats.getwork_wait_max.tv_sec = 0;
 		cgpu->cgminer_stats.getwork_wait_max.tv_sec = 0;

+ 3 - 0
miner.h

@@ -384,6 +384,8 @@ enum {
 };
 };
 
 
 struct cgminer_stats {
 struct cgminer_stats {
+	struct timeval start_tv;
+	
 	uint32_t getwork_calls;
 	uint32_t getwork_calls;
 	struct timeval getwork_wait;
 	struct timeval getwork_wait;
 	struct timeval getwork_wait_max;
 	struct timeval getwork_wait_max;
@@ -1262,6 +1264,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 void wlogprint(const char *f, ...) FORMAT_SYNTAX_CHECK(printf, 1, 2);
 extern int curses_int(const char *query);
 extern int curses_int(const char *query);
 extern char *curses_input(const char *query);
 extern char *curses_input(const char *query);
+extern double stats_elapsed(struct cgminer_stats *);
 extern void kill_work(void);
 extern void kill_work(void);
 extern int prioritize_pools(char *param, int *pid);
 extern int prioritize_pools(char *param, int *pid);
 extern void validate_pool_priorities(void);
 extern void validate_pool_priorities(void);