Browse Source

Make pool adding while running asynchronous, using the pool test thread functionality.

nfactor-troky
Con Kolivas 12 years ago
parent
commit
b6e3d5b4fa
  1. 74
      cgminer.c
  2. 2
      miner.h
  3. 2
      util.c

74
cgminer.c

@ -6512,7 +6512,35 @@ char *curses_input(const char *query)
} }
#endif #endif
void add_pool_details(struct pool *pool, bool live, char *url, char *user, char *pass) 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);
cg_wlock(&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;
}
cg_wunlock(&control_lock);
pool_resus(pool);
} else
pool_died(pool);
return NULL;
}
/* Always returns true that the pool details were added unless we are not
* live, implying this is the only pool being added, so if no pools are
* active it returns false. */
bool add_pool_details(struct pool *pool, bool live, char *url, char *user, char *pass)
{ {
url = get_proxy(url, pool); url = get_proxy(url, pool);
@ -6524,17 +6552,17 @@ void add_pool_details(struct pool *pool, bool live, char *url, char *user, char
quit(1, "Failed to malloc userpass"); quit(1, "Failed to malloc userpass");
sprintf(pool->rpc_userpass, "%s:%s", pool->rpc_user, pool->rpc_pass); sprintf(pool->rpc_userpass, "%s:%s", pool->rpc_user, pool->rpc_pass);
pool->testing = true;
pool->idle = true;
enable_pool(pool); enable_pool(pool);
/* Prevent noise on startup */ pthread_create(&pool->test_thread, NULL, test_pool_thread, (void *)pool);
pool->lagging = true; if (!live) {
pthread_join(pool->test_thread, NULL);
/* Test the pool is not idle if we're live running, otherwise pool->testing = false;
* it will be tested separately */ return pools_active;
if (live && !pool_active(pool, false)) {
gettimeofday(&pool->tv_idle, NULL);
pool->idle = true;
} }
return true;
} }
#ifdef HAVE_CURSES #ifdef HAVE_CURSES
@ -6574,8 +6602,7 @@ static bool input_pool(bool live)
url = httpinput; url = httpinput;
} }
add_pool_details(pool, live, url, user, pass); ret = add_pool_details(pool, live, url, user, pass);
ret = true;
out: out:
immedok(logwin, false); immedok(logwin, false);
@ -6988,31 +7015,6 @@ static void *hotplug_thread(void __maybe_unused *userdata)
} }
#endif #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);
cg_wlock(&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;
}
cg_wunlock(&control_lock);
pool_resus(pool);
} else
pool_died(pool);
return NULL;
}
static void probe_pools(void) static void probe_pools(void)
{ {
int i; int i;

2
miner.h

@ -849,7 +849,7 @@ extern int enabled_pools;
extern bool detect_stratum(struct pool *pool, char *url); extern bool detect_stratum(struct pool *pool, char *url);
extern void print_summary(void); extern void print_summary(void);
extern struct pool *add_pool(void); extern struct pool *add_pool(void);
extern void add_pool_details(struct pool *pool, bool live, char *url, char *user, char *pass); extern bool add_pool_details(struct pool *pool, bool live, char *url, char *user, char *pass);
#define MAX_GPUDEVICES 16 #define MAX_GPUDEVICES 16

2
util.c

@ -1398,7 +1398,7 @@ bool auth_stratum(struct pool *pool)
ss = json_dumps(err_val, JSON_INDENT(3)); ss = json_dumps(err_val, JSON_INDENT(3));
else else
ss = strdup("(unknown reason)"); ss = strdup("(unknown reason)");
applog(LOG_WARNING, "JSON stratum auth failed: %s", ss); applog(LOG_WARNING, "pool %d JSON stratum auth failed: %s", pool->pool_no, ss);
free(ss); free(ss);
goto out; goto out;

Loading…
Cancel
Save