From 52216625575c036b7a30984713f505547a050211 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Thu, 7 Mar 2013 16:39:49 +1100 Subject: [PATCH] Check all pools simultaneously at startup switching to the first alive one to speed up startup. --- cgminer.c | 60 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/cgminer.c b/cgminer.c index 61c5208e..2c06ec2b 100644 --- a/cgminer.c +++ b/cgminer.c @@ -6922,9 +6922,43 @@ static void *hotplug_thread(void __maybe_unused *userdata) } #endif +static bool pools_active = false; + +static void *test_pool_thread(void *arg) +{ + struct pool *pool = (struct pool *)arg; + + if (pool_active(pool, false)) { + pool_tset(pool, &pool->lagging); + pool_tclear(pool, &pool->idle); + applog(LOG_INFO, "Pool %d %s active", pool->pool_no, pool->rpc_url); + mutex_lock(&control_lock); + if (!pools_active) { + currentpool = pool; + if (pool->pool_no != 0) + applog(LOG_NOTICE, "Switching to pool %d %s - first alive pool", pool->pool_no, pool->rpc_url); + } + pools_active = true; + mutex_unlock(&control_lock); + } + + return NULL; +} + +static void probe_pools(void) +{ + int i; + + for (i = 0; i < total_pools; i++) { + pthread_t *test_thread = malloc(sizeof(pthread_t)); + struct pool *pool = pools[i]; + + pthread_create(test_thread, NULL, test_pool_thread, (void *)pool); + } +} + int main(int argc, char *argv[]) { - bool pools_active = false; struct sigaction handler; struct thr_info *thr; struct block *block; @@ -7299,24 +7333,14 @@ int main(int argc, char *argv[]) applog(LOG_NOTICE, "Probing for an alive pool"); do { + int slept = 0; + /* Look for at least one active pool before starting */ - for (i = 0; i < total_pools; i++) { - struct pool *pool = pools[i]; - - if (pool_active(pool, false)) { - pool_tset(pool, &pool->lagging); - pool_tclear(pool, &pool->idle); - if (!currentpool) - currentpool = pool; - applog(LOG_INFO, "Pool %d %s active", pool->pool_no, pool->rpc_url); - pools_active = true; - break; - } else { - if (pool == currentpool) - currentpool = NULL; - applog(LOG_WARNING, "Unable to get work from pool %d %s", pool->pool_no, pool->rpc_url); - } - } + probe_pools(); + do { + sleep(1); + slept++; + } while (!pools_active && slept < 60); if (!pools_active) { applog(LOG_ERR, "No servers were found that could be used to get work from.");