Move the stratum and GBT data to be protected under a new cg_lock data_lock.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
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;