diff --git a/cgminer.c b/cgminer.c index 3f8ba54f..cdfb889c 100644 --- a/cgminer.c +++ b/cgminer.c @@ -466,6 +466,7 @@ struct pool *add_pool(void) mutex_init(&pool->pool_lock); if (unlikely(pthread_cond_init(&pool->cr_cond, NULL))) quit(1, "Failed to pthread_cond_init in add_pool"); + cglock_init(&pool->data_lock); mutex_init(&pool->stratum_lock); mutex_init(&pool->gbt_lock); INIT_LIST_HEAD(&pool->curlring); @@ -3165,10 +3166,10 @@ static bool stale_work(struct work *work, bool share) } same_job = true; - mutex_lock(&pool->pool_lock); + cg_rlock(&pool->data_lock); if (strcmp(work->job_id, pool->swork.job_id)) same_job = false; - mutex_unlock(&pool->pool_lock); + cg_runlock(&pool->data_lock); if (!same_job) { applog(LOG_DEBUG, "Work stale due to stratum job_id mismatch"); return true; @@ -3310,9 +3311,9 @@ static void *submit_work_thread(void *userdata) pool->remotefail_occasions++; } - mutex_lock(&pool->pool_lock); + cg_rlock(&pool->data_lock); sessionid_match = (pool->nonce1 && !strcmp(work->nonce1, pool->nonce1)); - mutex_unlock(&pool->pool_lock); + cg_runlock(&pool->data_lock); if (!sessionid_match) { applog(LOG_DEBUG, "No matching session id for resubmitting stratum share"); @@ -4873,9 +4874,9 @@ static bool supports_resume(struct pool *pool) { bool ret; - mutex_lock(&pool->pool_lock); + cg_rlock(&pool->data_lock); ret = (pool->sessionid != NULL); - mutex_unlock(&pool->pool_lock); + cg_runlock(&pool->data_lock); return ret; } @@ -5333,7 +5334,7 @@ static void gen_stratum_work(struct pool *pool, struct work *work) size_t alloc_len; int i; - mutex_lock(&pool->pool_lock); + cg_wlock(&pool->data_lock); /* Generate coinbase */ work->nonce2 = bin2hex((const unsigned char *)&pool->nonce2, pool->n2size); @@ -5386,7 +5387,7 @@ static void gen_stratum_work(struct pool *pool, struct work *work) work->job_id = strdup(pool->swork.job_id); work->nonce1 = strdup(pool->nonce1); work->ntime = strdup(pool->swork.ntime); - mutex_unlock(&pool->pool_lock); + cg_wunlock(&pool->data_lock); applog(LOG_DEBUG, "Generated stratum merkle %s", merkle_hash); applog(LOG_DEBUG, "Generated stratum header %s", header); diff --git a/miner.h b/miner.h index 76c2a30c..5962cce1 100644 --- a/miner.h +++ b/miner.h @@ -1001,6 +1001,7 @@ struct pool { char *rpc_proxy; pthread_mutex_t pool_lock; + cglock_t data_lock; struct thread_q *submit_q; struct thread_q *getwork_q; diff --git a/util.c b/util.c index a2d3a7e3..1c77df14 100644 --- a/util.c +++ b/util.c @@ -1152,7 +1152,7 @@ static bool parse_notify(struct pool *pool, json_t *val) goto out; } - mutex_lock(&pool->pool_lock); + cg_wlock(&pool->data_lock); free(pool->swork.job_id); free(pool->swork.prev_hash); free(pool->swork.coinbase1); @@ -1191,7 +1191,7 @@ static bool parse_notify(struct pool *pool, json_t *val) /* workpadding */ 96; pool->swork.header_len = pool->swork.header_len * 2 + 1; align_len(&pool->swork.header_len); - mutex_unlock(&pool->pool_lock); + cg_wunlock(&pool->data_lock); if (opt_protocol) { applog(LOG_DEBUG, "job_id: %s", job_id); @@ -1222,9 +1222,9 @@ static bool parse_diff(struct pool *pool, json_t *val) if (diff == 0) return false; - mutex_lock(&pool->pool_lock); + cg_wlock(&pool->data_lock); pool->swork.diff = diff; - mutex_unlock(&pool->pool_lock); + cg_wunlock(&pool->data_lock); applog(LOG_DEBUG, "Pool %d difficulty set to %f", pool->pool_no, diff); @@ -1599,12 +1599,12 @@ resend: goto out; } - mutex_lock(&pool->pool_lock); + cg_wlock(&pool->data_lock); pool->sessionid = sessionid; pool->nonce1 = nonce1; pool->n1_len = strlen(nonce1) / 2; pool->n2size = n2size; - mutex_unlock(&pool->pool_lock); + cg_wunlock(&pool->data_lock); if (sessionid) applog(LOG_DEBUG, "Pool %d stratum session id: %s", pool->pool_no, pool->sessionid); @@ -1628,11 +1628,11 @@ out: /* Reset the sessionid used for stratum resuming in case the pool * does not support it, or does not know how to respond to the * presence of the sessionid parameter. */ - mutex_lock(&pool->pool_lock); + cg_wlock(&pool->data_lock); free(pool->sessionid); free(pool->nonce1); pool->sessionid = pool->nonce1 = NULL; - mutex_unlock(&pool->pool_lock); + cg_wunlock(&pool->data_lock); applog(LOG_DEBUG, "Failed to resume stratum, trying afresh"); noresume = true; goto resend;