|
@@ -1173,6 +1173,7 @@ struct pool *add_pool2(struct mining_goal_info * const goal)
|
|
|
if (unlikely(pthread_cond_init(&pool->cr_cond, bfg_condattr)))
|
|
if (unlikely(pthread_cond_init(&pool->cr_cond, bfg_condattr)))
|
|
|
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;
|
|
@@ -10272,6 +10273,7 @@ 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);
|
|
|
|
|
+ dst->data_lock_p = NULL;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void stratum_work_clean(struct stratum_work * const swork)
|
|
void stratum_work_clean(struct stratum_work * const swork)
|
|
@@ -10306,7 +10308,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);
|
|
@@ -10331,11 +10332,8 @@ static void gen_stratum_work(struct pool *pool, struct work *work)
|
|
|
|
|
|
|
|
void gen_stratum_work2(struct work *work, struct stratum_work *swork)
|
|
void gen_stratum_work2(struct work *work, struct stratum_work *swork)
|
|
|
{
|
|
{
|
|
|
- unsigned char *coinbase, merkle_root[32], merkle_sha[64];
|
|
|
|
|
- uint8_t *merkle_bin;
|
|
|
|
|
- uint32_t *data32, *swap32;
|
|
|
|
|
- int i;
|
|
|
|
|
-
|
|
|
|
|
|
|
+ unsigned char *coinbase;
|
|
|
|
|
+
|
|
|
/* Generate coinbase */
|
|
/* Generate coinbase */
|
|
|
coinbase = bytes_buf(&swork->coinbase);
|
|
coinbase = bytes_buf(&swork->coinbase);
|
|
|
memcpy(&coinbase[swork->nonce2_offset], bytes_buf(&work->nonce2), bytes_len(&work->nonce2));
|
|
memcpy(&coinbase[swork->nonce2_offset], bytes_buf(&work->nonce2), bytes_len(&work->nonce2));
|
|
@@ -10343,7 +10341,29 @@ void gen_stratum_work2(struct work *work, struct stratum_work *swork)
|
|
|
/* Downgrade to a read lock to read off the variables */
|
|
/* Downgrade to a read lock to read off the variables */
|
|
|
if (swork->data_lock_p)
|
|
if (swork->data_lock_p)
|
|
|
cg_dwlock(swork->data_lock_p);
|
|
cg_dwlock(swork->data_lock_p);
|
|
|
|
|
+
|
|
|
|
|
+ gen_stratum_work3(work, swork, swork->data_lock_p);
|
|
|
|
|
+
|
|
|
|
|
+ if (opt_debug)
|
|
|
|
|
+ {
|
|
|
|
|
+ char header[161];
|
|
|
|
|
+ char nonce2hex[(bytes_len(&work->nonce2) * 2) + 1];
|
|
|
|
|
+ bin2hex(header, work->data, 80);
|
|
|
|
|
+ bin2hex(nonce2hex, bytes_buf(&work->nonce2), bytes_len(&work->nonce2));
|
|
|
|
|
+ applog(LOG_DEBUG, "Generated stratum header %s", header);
|
|
|
|
|
+ applog(LOG_DEBUG, "Work job_id %s nonce2 %s", work->job_id, nonce2hex);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
|
|
+void gen_stratum_work3(struct work * const work, struct stratum_work * const swork, cglock_t * const data_lock_p)
|
|
|
|
|
+{
|
|
|
|
|
+ unsigned char *coinbase, merkle_root[32], merkle_sha[64];
|
|
|
|
|
+ uint8_t *merkle_bin;
|
|
|
|
|
+ uint32_t *data32, *swap32;
|
|
|
|
|
+ int i;
|
|
|
|
|
+
|
|
|
|
|
+ coinbase = bytes_buf(&swork->coinbase);
|
|
|
|
|
+
|
|
|
/* Generate merkle root */
|
|
/* Generate merkle root */
|
|
|
gen_hash(coinbase, merkle_root, bytes_len(&swork->coinbase));
|
|
gen_hash(coinbase, merkle_root, bytes_len(&swork->coinbase));
|
|
|
memcpy(merkle_sha, merkle_root, 32);
|
|
memcpy(merkle_sha, merkle_root, 32);
|
|
@@ -10370,18 +10390,8 @@ void gen_stratum_work2(struct work *work, struct stratum_work *swork)
|
|
|
memcpy(work->target, swork->target, sizeof(work->target));
|
|
memcpy(work->target, swork->target, sizeof(work->target));
|
|
|
work->job_id = maybe_strdup(swork->job_id);
|
|
work->job_id = maybe_strdup(swork->job_id);
|
|
|
work->nonce1 = maybe_strdup(swork->nonce1);
|
|
work->nonce1 = maybe_strdup(swork->nonce1);
|
|
|
- if (swork->data_lock_p)
|
|
|
|
|
- cg_runlock(swork->data_lock_p);
|
|
|
|
|
-
|
|
|
|
|
- if (opt_debug)
|
|
|
|
|
- {
|
|
|
|
|
- char header[161];
|
|
|
|
|
- char nonce2hex[(bytes_len(&work->nonce2) * 2) + 1];
|
|
|
|
|
- bin2hex(header, work->data, 80);
|
|
|
|
|
- bin2hex(nonce2hex, bytes_buf(&work->nonce2), bytes_len(&work->nonce2));
|
|
|
|
|
- applog(LOG_DEBUG, "Generated stratum header %s", header);
|
|
|
|
|
- applog(LOG_DEBUG, "Work job_id %s nonce2 %s", work->job_id, nonce2hex);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (data_lock_p)
|
|
|
|
|
+ cg_runlock(data_lock_p);
|
|
|
|
|
|
|
|
calc_midstate(work);
|
|
calc_midstate(work);
|
|
|
|
|
|