Commit 26ddd1fd203e918a53e39060229e1be73aafbac6

Con Kolivas 2013-03-12T22:31:45

Move the stratum and GBT data to be protected under a new cg_lock data_lock.

diff --git a/cgminer.c b/cgminer.c
index 3f8ba54..cdfb889 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 76c2a30..5962cce 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 a2d3a7e..1c77df1 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;