Browse Source

Merge commit 'b8ed231' into cg_merges_20130513

Conflicts:
	miner.c
Luke Dashjr 12 years ago
parent
commit
8dabfeb856
2 changed files with 27 additions and 2 deletions
  1. 6 2
      miner.c
  2. 21 0
      miner.h

+ 6 - 2
miner.c

@@ -6691,11 +6691,15 @@ static void gen_stratum_work(struct pool *pool, struct work *work)
 
 	clean_work(work);
 
-	cg_wlock(&pool->data_lock);
+	/* Use intermediate lock to update the one pool variable */
+	cg_ilock(&pool->data_lock);
 
 	/* Generate coinbase */
 	work->nonce2 = bin2hex((const unsigned char *)&pool->nonce2, pool->n2size);
 	pool->nonce2++;
+
+	/* Downgrade to a read lock to read off the pool variables */
+	cg_dlock(&pool->data_lock);
 	alloc_len = pool->swork.cb_len;
 	align_len(&alloc_len);
 	coinbase = calloc(alloc_len, 1);
@@ -6744,7 +6748,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);
-	cg_wunlock(&pool->data_lock);
+	cg_runlock(&pool->data_lock);
 
 	applog(LOG_DEBUG, "Generated stratum merkle %s", merkle_hash);
 	applog(LOG_DEBUG, "Generated stratum header %s", header);

+ 21 - 0
miner.h

@@ -769,6 +769,7 @@ static inline void cglock_init(cglock_t *lock)
 	rwlock_init(&lock->rwlock);
 }
 
+/* Read lock variant of cglock */
 static inline void cg_rlock(cglock_t *lock)
 {
 	mutex_lock(&lock->mutex);
@@ -776,10 +777,29 @@ static inline void cg_rlock(cglock_t *lock)
 	mutex_unlock(&lock->mutex);
 }
 
+/* Intermediate variant of cglock */
+static inline void cg_ilock(cglock_t *lock)
+{
+	mutex_lock(&lock->mutex);
+}
+
+/* Upgrade intermediate variant to a write lock */
+static inline void cg_ulock(cglock_t *lock)
+{
+	wr_lock(&lock->rwlock);
+}
+
+/* Write lock variant of cglock */
 static inline void cg_wlock(cglock_t *lock)
 {
 	mutex_lock(&lock->mutex);
 	wr_lock(&lock->rwlock);
+}
+
+/* Downgrade intermediate variant to a read lock */
+static inline void cg_dlock(cglock_t *lock)
+{
+	rd_lock(&lock->rwlock);
 	mutex_unlock(&lock->mutex);
 }
 
@@ -791,6 +811,7 @@ static inline void cg_runlock(cglock_t *lock)
 static inline void cg_wunlock(cglock_t *lock)
 {
 	wr_unlock(&lock->rwlock);
+	mutex_unlock(&lock->mutex);
 }
 
 struct pool;