From e12d666d360f49ecfee661bf3e0baa8a543ad827 Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Sat, 24 Oct 2015 09:40:36 +0200 Subject: [PATCH] pool switch: add thr_id param to handle a future barrier Switching to a pool with a different algo will require a barrier to free ressources, like what was made in the global benchmark. add also the algo in pool structure... --- algos.h | 2 ++ api.cpp | 6 +++--- bench.cpp | 1 - ccminer.cpp | 10 +++++----- cuda.cpp | 2 +- miner.h | 5 +++-- pools.cpp | 19 +++++++++++++------ 7 files changed, 27 insertions(+), 18 deletions(-) diff --git a/algos.h b/algos.h index b3fb381..4eb40d0 100644 --- a/algos.h +++ b/algos.h @@ -45,6 +45,8 @@ enum sha_algos { ALGO_COUNT }; +extern volatile enum sha_algos opt_algo; + static const char *algo_names[] = { "blakecoin", "blake", diff --git a/api.cpp b/api.cpp index 6d09f1d..86e2b4f 100644 --- a/api.cpp +++ b/api.cpp @@ -409,13 +409,13 @@ static char *remote_switchpool(char *params) return buffer; if (!params || strlen(params) == 0) { // rotate pool test - ret = pool_switch_next(); + ret = pool_switch_next(-1); } else { int n = atoi(params); if (n == cur_pooln) ret = true; else if (n < num_pools) - ret = pool_switch(n); + ret = pool_switch(-1, n); } sprintf(buffer, "%s|", ret ? "ok" : "fail"); return buffer; @@ -433,7 +433,7 @@ static char *remote_seturl(char *params) return buffer; if (!params || strlen(params) == 0) { // rotate pool test - ret = pool_switch_next(); + ret = pool_switch_next(-1); } else { ret = pool_switch_url(params); } diff --git a/bench.cpp b/bench.cpp index 1100d4b..aab5d0f 100644 --- a/bench.cpp +++ b/bench.cpp @@ -21,7 +21,6 @@ static pthread_barrier_t algo_barr; static pthread_mutex_t bench_lock = PTHREAD_MUTEX_INITIALIZER; extern double thr_hashrates[MAX_GPUS]; -extern volatile enum sha_algos opt_algo; void bench_init(int threads) { diff --git a/ccminer.cpp b/ccminer.cpp index 25e640c..b670e76 100644 --- a/ccminer.cpp +++ b/ccminer.cpp @@ -1181,7 +1181,7 @@ static void *workio_thread(void *userdata) if (!ok && num_pools > 1 && opt_pool_failover) { if (opt_debug_threads) applog(LOG_DEBUG, "%s died, failover", __func__); - ok = pool_switch_next(); + ok = pool_switch_next(-1); tq_push(wc->thr->q, NULL); // get_work() will return false } @@ -1633,7 +1633,7 @@ static void *miner_thread(void *userdata) // conditional pool switch if (num_pools > 1 && conditional_pool_rotate) { if (!pool_is_switching) - pool_switch_next(); + pool_switch_next(thr_id); else if (time(NULL) - firstwork_time > 35) { if (!opt_quiet) applog(LOG_WARNING, "Pool switching timed out..."); @@ -1670,7 +1670,7 @@ static void *miner_thread(void *userdata) if (!pool_is_switching) { if (!opt_quiet) applog(LOG_INFO, "Pool mining timeout of %ds reached, rotate...", opt_time_limit); - pool_switch_next(); + pool_switch_next(thr_id); } else if (passed > 35) { // ensure we dont stay locked if pool_is_switching is not reset... applog(LOG_WARNING, "Pool switch to %d timed out...", cur_pooln); @@ -2233,7 +2233,7 @@ wait_stratum_url: if (opt_retries >= 0 && ++failures > opt_retries) { if (num_pools > 1 && opt_pool_failover) { applog(LOG_WARNING, "Stratum connect timeout, failover..."); - pool_switch_next(); + pool_switch_next(-1); } else { applog(LOG_ERR, "...terminating workio thread"); //tq_push(thr_info[work_thr_id].q, NULL); @@ -3079,7 +3079,7 @@ int main(int argc, char *argv[]) if (opt_debug) pool_dump_infos(); cur_pooln = pool_get_first_valid(0); - pool_switch(cur_pooln); + pool_switch(-1, cur_pooln); flags = !opt_benchmark && strncmp(rpc_url, "https:", 6) ? (CURL_GLOBAL_ALL & ~CURL_GLOBAL_SSL) diff --git a/cuda.cpp b/cuda.cpp index 635d9df..fb32cfa 100644 --- a/cuda.cpp +++ b/cuda.cpp @@ -151,7 +151,7 @@ uint32_t cuda_default_throughput(int thr_id, uint32_t defcount) //int dev_id = device_map[thr_id % MAX_GPUS]; uint32_t throughput = gpus_intensity[thr_id] ? gpus_intensity[thr_id] : defcount; if (gpu_threads > 1 && throughput == defcount) throughput /= (gpu_threads-1); - api_set_throughput(thr_id, throughput); + if (api_thr_id != -1) api_set_throughput(thr_id, throughput); //gpulog(LOG_INFO, thr_id, "throughput %u", throughput); return throughput; } diff --git a/miner.h b/miner.h index 9c53b35..8f57126 100644 --- a/miner.h +++ b/miner.h @@ -653,6 +653,7 @@ struct pool_infos { #define POOL_ST_DISABLED 4 #define POOL_ST_REMOVED 8 uint16_t status; + int algo; char name[64]; // credentials char url[256]; @@ -691,8 +692,8 @@ void pool_init_defaults(void); void pool_set_creds(int pooln); void pool_set_attr(int pooln, const char* key, char* arg); bool pool_switch_url(char *params); -bool pool_switch(int pooln); -bool pool_switch_next(void); +bool pool_switch(int thr_id, int pooln); +bool pool_switch_next(int thr_id); int pool_get_first_valid(int startfrom); bool parse_pool_array(json_t *obj); void pool_dump_infos(void); diff --git a/pools.cpp b/pools.cpp index c0318b6..fb295d7 100644 --- a/pools.cpp +++ b/pools.cpp @@ -9,6 +9,7 @@ #include "miner.h" #include "compat.h" +#include "algos.h" // to move in miner.h extern bool allow_gbt; @@ -50,6 +51,7 @@ struct opt_config_array { { CFG_POOL, "user", NULL }, { CFG_POOL, "pass", NULL }, { CFG_POOL, "userpass", NULL }, + { CFG_POOL, "algo", NULL }, { CFG_POOL, "name", "pool-name" }, { CFG_POOL, "scantime", "pool-scantime" }, { CFG_POOL, "max-diff", "pool-max-diff" }, @@ -74,7 +76,8 @@ void pool_set_creds(int pooln) p->id = pooln; p->status |= POOL_ST_DEFINED; // init pool options as "unset" - // until cmdline is not fully parsed... + // until cmdline is fully parsed... + p->algo = -1; p->max_diff = -1.; p->max_rate = -1.; p->scantime = -1; @@ -102,6 +105,7 @@ void pool_init_defaults() struct pool_infos *p; for (int i=0; ialgo == -1) p->algo = (int) opt_algo; if (p->max_diff == -1.) p->max_diff = opt_max_diff; if (p->max_rate == -1.) p->max_rate = opt_max_rate; if (p->scantime == -1) p->scantime = opt_scantime; @@ -113,7 +117,10 @@ void pool_init_defaults() void pool_set_attr(int pooln, const char* key, char* arg) { struct pool_infos *p = &pools[pooln]; - + if (!strcasecmp(key, "algo")) { + p->algo = algo_to_int(arg); + return; + } if (!strcasecmp(key, "name")) { snprintf(p->name, sizeof(p->name), "%s", arg); return; @@ -144,7 +151,7 @@ void pool_set_attr(int pooln, const char* key, char* arg) } // pool switching code -bool pool_switch(int pooln) +bool pool_switch(int thr_id, int pooln) { int prevn = cur_pooln; struct pool_infos *prev = &pools[cur_pooln]; @@ -255,11 +262,11 @@ int pool_get_first_valid(int startfrom) } // switch to next available pool -bool pool_switch_next() +bool pool_switch_next(int thr_id) { if (num_pools > 1) { int pooln = pool_get_first_valid(cur_pooln+1); - return pool_switch(pooln); + return pool_switch(thr_id, pooln); } else { // no switch possible if (!opt_quiet) @@ -279,7 +286,7 @@ bool pool_switch_url(char *params) cur_pooln = prevn; if (nextn == prevn) return false; - return pool_switch(nextn); + return pool_switch(-1, nextn); } // Parse pools array in json config