Browse Source

Add intermediate variants of cglocks that can be up or downgraded to read or write locks and use them for stratum work generation.

Con Kolivas 13 years ago
parent
commit
b8ed231f64
2 changed files with 27 additions and 2 deletions
  1. 6 2
      cgminer.c
  2. 21 0
      miner.h

+ 6 - 2
cgminer.c

@@ -5334,11 +5334,15 @@ static void gen_stratum_work(struct pool *pool, struct work *work)
 	size_t alloc_len;
 	int i;
 
-	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);
@@ -5387,7 +5391,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

@@ -710,6 +710,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);
@@ -717,10 +718,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);
 }
 
@@ -732,6 +752,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;