Browse Source

Bugfix: Coordinate swork data_lock_p saner

Luke Dashjr 12 years ago
parent
commit
cf461f9c82
1 changed files with 4 additions and 1 deletions
  1. 4 1
      miner.c

+ 4 - 1
miner.c

@@ -1059,6 +1059,7 @@ struct pool *add_pool(void)
 	if (unlikely(pthread_cond_init(&pool->cr_cond, NULL)))
 	if (unlikely(pthread_cond_init(&pool->cr_cond, NULL)))
 		quit(1, "Failed to pthread_cond_init in add_pool");
 		quit(1, "Failed to pthread_cond_init in add_pool");
 	cglock_init(&pool->data_lock);
 	cglock_init(&pool->data_lock);
+	pool->swork.data_lock_p = &pool->data_lock;
 	mutex_init(&pool->stratum_lock);
 	mutex_init(&pool->stratum_lock);
 	timer_unset(&pool->swork.tv_transparency);
 	timer_unset(&pool->swork.tv_transparency);
 	pool->swork.pool = pool;
 	pool->swork.pool = pool;
@@ -9283,6 +9284,9 @@ void stratum_work_cpy(struct stratum_work * const dst, const struct stratum_work
 	dst->job_id = maybe_strdup(src->job_id);
 	dst->job_id = maybe_strdup(src->job_id);
 	bytes_cpy(&dst->coinbase, &src->coinbase);
 	bytes_cpy(&dst->coinbase, &src->coinbase);
 	bytes_cpy(&dst->merkle_bin, &src->merkle_bin);
 	bytes_cpy(&dst->merkle_bin, &src->merkle_bin);
+	
+	// Clear data_lock_p, which is locking src, but not necessarily dst
+	dst->data_lock_p = NULL;
 }
 }
 
 
 void stratum_work_clean(struct stratum_work * const swork)
 void stratum_work_clean(struct stratum_work * const swork)
@@ -9317,7 +9321,6 @@ static void gen_stratum_work(struct pool *pool, struct work *work)
 	clean_work(work);
 	clean_work(work);
 	
 	
 	cg_wlock(&pool->data_lock);
 	cg_wlock(&pool->data_lock);
-	pool->swork.data_lock_p = &pool->data_lock;
 	
 	
 	const int n2size = pool->swork.n2size;
 	const int n2size = pool->swork.n2size;
 	bytes_resize(&work->nonce2, n2size);
 	bytes_resize(&work->nonce2, n2size);