Browse Source

Use only one longpoll as much as possible by using a pthread conditional broadcast that each longpoll thread waits on and checks if it's the current pool before opening its longpoll connection.

nfactor-troky
Con Kolivas 13 years ago
parent
commit
2586bda59a
  1. 23
      cgminer.c

23
cgminer.c

@ -165,6 +165,9 @@ static pthread_rwlock_t blk_lock;
pthread_rwlock_t netacc_lock; pthread_rwlock_t netacc_lock;
static pthread_mutex_t lp_lock;
static pthread_cond_t lp_cond;
double total_mhashes_done; double total_mhashes_done;
static struct timeval total_tv_start, total_tv_end; static struct timeval total_tv_start, total_tv_end;
@ -2283,6 +2286,10 @@ void switch_pools(struct pool *selected)
mutex_lock(&qd_lock); mutex_lock(&qd_lock);
total_queued = 0; total_queued = 0;
mutex_unlock(&qd_lock); mutex_unlock(&qd_lock);
mutex_lock(&lp_lock);
pthread_cond_broadcast(&lp_cond);
mutex_unlock(&lp_lock);
} }
static void discard_work(struct work *work) static void discard_work(struct work *work)
@ -3993,6 +4000,14 @@ static struct pool *select_longpoll_pool(struct pool *cp)
return NULL; return NULL;
} }
static void wait_lpcurrent(struct pool *pool)
{
while (pool != current_pool()) {
mutex_lock(&lp_lock);
pthread_cond_wait(&lp_cond, &lp_lock);
}
}
static void *longpoll_thread(void *userdata) static void *longpoll_thread(void *userdata)
{ {
struct pool *cp = (struct pool *)userdata; struct pool *cp = (struct pool *)userdata;
@ -4023,6 +4038,8 @@ retry_pool:
/* Any longpoll from any pool is enough for this to be true */ /* Any longpoll from any pool is enough for this to be true */
have_longpoll = true; have_longpoll = true;
wait_lpcurrent(cp);
if (cp == pool) if (cp == pool)
applog(LOG_WARNING, "Long-polling activated for %s", pool->lp_url); applog(LOG_WARNING, "Long-polling activated for %s", pool->lp_url);
else else
@ -4031,6 +4048,8 @@ retry_pool:
while (42) { while (42) {
json_t *val, *soval; json_t *val, *soval;
wait_lpcurrent(cp);
gettimeofday(&start, NULL); gettimeofday(&start, NULL);
/* Longpoll connections can be persistent for a very long time /* Longpoll connections can be persistent for a very long time
@ -4726,6 +4745,10 @@ int main(int argc, char *argv[])
rwlock_init(&blk_lock); rwlock_init(&blk_lock);
rwlock_init(&netacc_lock); rwlock_init(&netacc_lock);
mutex_init(&lp_lock);
if (unlikely(pthread_cond_init(&lp_cond, NULL)))
quit(1, "Failed to pthread_cond_init lp_cond");
sprintf(packagename, "%s %s", PACKAGE, VERSION); sprintf(packagename, "%s %s", PACKAGE, VERSION);
#ifdef WANT_CPUMINE #ifdef WANT_CPUMINE

Loading…
Cancel
Save