From 00158c3a1faa594c0dbb5a4b3ad18d9879cd6610 Mon Sep 17 00:00:00 2001 From: Kano Date: Sat, 5 May 2012 16:25:19 +1000 Subject: [PATCH] API 'stats' allow devices to add their own stats also for testing/debug --- api.c | 30 ++++++++++++++++++++---------- miner.h | 1 + 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/api.c b/api.c index ea3eeb34..1791f04e 100644 --- a/api.c +++ b/api.c @@ -2004,20 +2004,24 @@ void dosave(__maybe_unused SOCKETTYPE c, char *param, bool isjson) ptr = NULL; } -static int itemstats(int i, char *id, struct cgminer_stats *stats, bool isjson) +static int itemstats(int i, char *id, struct cgminer_stats *stats, char *extra, bool isjson) { char buf[BUFSIZ]; - if (stats->getwork_calls) + if (stats->getwork_calls || (extra != NULL && *extra)) { + if (extra == NULL) + extra = (char *)BLANK; + sprintf(buf, isjson - ? "%s{\"STATS\":%d,\"ID\":\"%s\",\"Elapsed\":%.0f,\"Calls\":%d,\"Wait\":%ld.%06ld,\"Max\":%ld.%06ld,\"Min\":%ld.%06ld}" - : "%sSTATS=%d,ID=%s,Elapsed=%.0f,Calls=%d,Wait=%ld.%06ld,Max=%ld.%06ld,Min=%ld.%06ld" SEPSTR, + ? "%s{\"STATS\":%d,\"ID\":\"%s\",\"Elapsed\":%.0f,\"Calls\":%d,\"Wait\":%ld.%06ld,\"Max\":%ld.%06ld,\"Min\":%ld.%06ld%s%s}" + : "%sSTATS=%d,ID=%s,Elapsed=%.0f,Calls=%d,Wait=%ld.%06ld,Max=%ld.%06ld,Min=%ld.%06ld%s%s" SEPSTR, (isjson && (i > 0)) ? COMMA : BLANK, i, id, total_secs, stats->getwork_calls, stats->getwork_wait.tv_sec, stats->getwork_wait.tv_usec, stats->getwork_wait_max.tv_sec, stats->getwork_wait_max.tv_usec, - stats->getwork_wait_min.tv_sec, stats->getwork_wait_min.tv_usec); + stats->getwork_wait_min.tv_sec, stats->getwork_wait_min.tv_usec, + *extra ? COMMA : BLANK, extra); strcat(io_buffer, buf); @@ -2028,7 +2032,8 @@ static int itemstats(int i, char *id, struct cgminer_stats *stats, bool isjson) } static void minerstats(__maybe_unused SOCKETTYPE c, __maybe_unused char *param, bool isjson) { - char buf[BUFSIZ]; + char extra[BUFSIZ]; + char id[20]; int i, j; strcpy(io_buffer, message(MSG_MINESTATS, 0, NULL, isjson)); @@ -2043,16 +2048,21 @@ static void minerstats(__maybe_unused SOCKETTYPE c, __maybe_unused char *param, struct cgpu_info *cgpu = devices[j]; if (cgpu && cgpu->api) { - sprintf(buf, "%s%d", cgpu->api->name, cgpu->device_id); - i = itemstats(i, buf, &(cgpu->cgminer_stats), isjson); + if (cgpu->api->get_api_stats) + cgpu->api->get_api_stats(extra, cgpu, isjson); + else + extra[0] = '\0'; + + sprintf(id, "%s%d", cgpu->api->name, cgpu->device_id); + i = itemstats(i, id, &(cgpu->cgminer_stats), extra, isjson); } } for (j = 0; j < total_pools; j++) { struct pool *pool = pools[j]; - sprintf(buf, "POOL%d", j); - i = itemstats(i, buf, &(pool->cgminer_stats), isjson); + sprintf(id, "POOL%d", j); + i = itemstats(i, id, &(pool->cgminer_stats), NULL, isjson); } if (isjson) diff --git a/miner.h b/miner.h index 4c58bfd8..961d8608 100644 --- a/miner.h +++ b/miner.h @@ -205,6 +205,7 @@ struct device_api { void (*reinit_device)(struct cgpu_info*); void (*get_statline_before)(char*, struct cgpu_info*); void (*get_statline)(char*, struct cgpu_info*); + void (*get_api_stats)(char*, struct cgpu_info*, bool); // Thread-specific functions bool (*thread_prepare)(struct thr_info*);