Browse Source

Move "nonce1" session id from struct pool to struct stratum_work

Luke Dashjr 12 years ago
parent
commit
8418edecfb
4 changed files with 15 additions and 14 deletions
  1. 1 4
      driver-stratum.c
  2. 6 4
      miner.c
  3. 4 2
      miner.h
  4. 4 4
      util.c

+ 1 - 4
driver-stratum.c

@@ -44,7 +44,6 @@ struct stratumsrv_job {
 	
 	
 	struct timeval tv_prepared;
 	struct timeval tv_prepared;
 	struct stratum_work swork;
 	struct stratum_work swork;
-	char *nonce1;
 	
 	
 	UT_hash_handle hh;
 	UT_hash_handle hh;
 };
 };
@@ -91,7 +90,7 @@ void _ssm_gen_dummy_work(struct work *work, struct stratumsrv_job *ssj, const ch
 	memcpy(p, &xnonce1, _ssm_client_octets);
 	memcpy(p, &xnonce1, _ssm_client_octets);
 	if (p != s)
 	if (p != s)
 		memset(s, '\xbb', p - s);
 		memset(s, '\xbb', p - s);
-	gen_stratum_work2(work, &ssj->swork, ssj->nonce1);
+	gen_stratum_work2(work, &ssj->swork);
 }
 }
 
 
 static
 static
@@ -143,7 +142,6 @@ bool stratumsrv_update_notify_str(struct pool * const pool, bool clean)
 	ssj = malloc(sizeof(*ssj));
 	ssj = malloc(sizeof(*ssj));
 	*ssj = (struct stratumsrv_job){
 	*ssj = (struct stratumsrv_job){
 		.my_job_id = strdup(my_job_id),
 		.my_job_id = strdup(my_job_id),
-		.nonce1 = maybe_strdup(pool->nonce1),
 	};
 	};
 	timer_set_now(&ssj->tv_prepared);
 	timer_set_now(&ssj->tv_prepared);
 	stratum_work_cpy(&ssj->swork, swork);
 	stratum_work_cpy(&ssj->swork, swork);
@@ -177,7 +175,6 @@ void _ssj_free(struct stratumsrv_job * const ssj)
 {
 {
 	free(ssj->my_job_id);
 	free(ssj->my_job_id);
 	stratum_work_clean(&ssj->swork);
 	stratum_work_clean(&ssj->swork);
-	free(ssj->nonce1);
 	free(ssj);
 	free(ssj);
 }
 }
 
 

+ 6 - 4
miner.c

@@ -5727,7 +5727,7 @@ next_write_sws:
 			cg_rlock(&pool->data_lock);
 			cg_rlock(&pool->data_lock);
 			// NOTE: cgminer only does this check on retries, but BFGMiner does it for even the first/normal submit; therefore, it needs to be such that it always is true on the same connection regardless of session management
 			// NOTE: cgminer only does this check on retries, but BFGMiner does it for even the first/normal submit; therefore, it needs to be such that it always is true on the same connection regardless of session management
 			// NOTE: Worst case scenario for a false positive: the pool rejects it as H-not-zero
 			// NOTE: Worst case scenario for a false positive: the pool rejects it as H-not-zero
-			sessionid_match = (!pool->nonce1) || !strcmp(work->nonce1, pool->nonce1);
+			sessionid_match = (!pool->swork.nonce1) || !strcmp(work->nonce1, pool->swork.nonce1);
 			cg_runlock(&pool->data_lock);
 			cg_runlock(&pool->data_lock);
 			if (!sessionid_match)
 			if (!sessionid_match)
 			{
 			{
@@ -8712,6 +8712,7 @@ void stratum_work_cpy(struct stratum_work * const dst, const struct stratum_work
 	*dst = *src;
 	*dst = *src;
 	if (dst->tr)
 	if (dst->tr)
 		tmpl_incref(dst->tr);
 		tmpl_incref(dst->tr);
+	dst->nonce1 = maybe_strdup(src->nonce1);
 	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);
@@ -8721,6 +8722,7 @@ void stratum_work_clean(struct stratum_work * const swork)
 {
 {
 	if (swork->tr)
 	if (swork->tr)
 		tmpl_decref(swork->tr);
 		tmpl_decref(swork->tr);
+	free(swork->nonce1);
 	free(swork->job_id);
 	free(swork->job_id);
 	bytes_free(&swork->coinbase);
 	bytes_free(&swork->coinbase);
 	bytes_free(&swork->merkle_bin);
 	bytes_free(&swork->merkle_bin);
@@ -8764,12 +8766,12 @@ static void gen_stratum_work(struct pool *pool, struct work *work)
 	
 	
 	work->pool = pool;
 	work->pool = pool;
 	work->work_restart_id = pool->swork.work_restart_id;
 	work->work_restart_id = pool->swork.work_restart_id;
-	gen_stratum_work2(work, &pool->swork, pool->nonce1);
+	gen_stratum_work2(work, &pool->swork);
 	
 	
 	cgtime(&work->tv_staged);
 	cgtime(&work->tv_staged);
 }
 }
 
 
-void gen_stratum_work2(struct work *work, struct stratum_work *swork, const char *nonce1)
+void gen_stratum_work2(struct work *work, struct stratum_work *swork)
 {
 {
 	unsigned char *coinbase, merkle_root[32], merkle_sha[64];
 	unsigned char *coinbase, merkle_root[32], merkle_sha[64];
 	uint8_t *merkle_bin;
 	uint8_t *merkle_bin;
@@ -8810,7 +8812,7 @@ void gen_stratum_work2(struct work *work, struct stratum_work *swork, const char
 
 
 	/* Copy parameters required for share submission */
 	/* Copy parameters required for share submission */
 	work->job_id = maybe_strdup(swork->job_id);
 	work->job_id = maybe_strdup(swork->job_id);
-	work->nonce1 = maybe_strdup(nonce1);
+	work->nonce1 = maybe_strdup(swork->nonce1);
 	if (swork->data_lock_p)
 	if (swork->data_lock_p)
 		cg_runlock(swork->data_lock_p);
 		cg_runlock(swork->data_lock_p);
 
 

+ 4 - 2
miner.h

@@ -1133,6 +1133,9 @@ struct bfg_tmpl_ref {
 };
 };
 
 
 struct stratum_work {
 struct stratum_work {
+	// Used only as a session id for resuming
+	char *nonce1;
+	
 	struct bfg_tmpl_ref *tr;
 	struct bfg_tmpl_ref *tr;
 	char *job_id;
 	char *job_id;
 	bool clean;
 	bool clean;
@@ -1250,7 +1253,6 @@ struct pool {
 	char *sockbuf;
 	char *sockbuf;
 	size_t sockbuf_size;
 	size_t sockbuf_size;
 	char *sockaddr_url; /* stripped url used for sockaddr */
 	char *sockaddr_url; /* stripped url used for sockaddr */
-	char *nonce1;
 	size_t n1_len;
 	size_t n1_len;
 	uint32_t nonce2;
 	uint32_t nonce2;
 	int nonce2sz;
 	int nonce2sz;
@@ -1355,7 +1357,7 @@ extern void get_datestamp(char *, size_t, time_t);
 extern void stratum_work_cpy(struct stratum_work *dst, const struct stratum_work *src);
 extern void stratum_work_cpy(struct stratum_work *dst, const struct stratum_work *src);
 extern void stratum_work_clean(struct stratum_work *);
 extern void stratum_work_clean(struct stratum_work *);
 extern bool pool_has_usable_swork(const struct pool *);
 extern bool pool_has_usable_swork(const struct pool *);
-extern void gen_stratum_work2(struct work *, struct stratum_work *, const char *nonce1);
+extern void gen_stratum_work2(struct work *, struct stratum_work *);
 extern void inc_hw_errors3(struct thr_info *thr, const struct work *work, const uint32_t *bad_nonce_p, float nonce_diff);
 extern void inc_hw_errors3(struct thr_info *thr, const struct work *work, const uint32_t *bad_nonce_p, float nonce_diff);
 static inline
 static inline
 void inc_hw_errors2(struct thr_info * const thr, const struct work * const work, const uint32_t *bad_nonce_p)
 void inc_hw_errors2(struct thr_info * const thr, const struct work * const work, const uint32_t *bad_nonce_p)

+ 4 - 4
util.c

@@ -1928,7 +1928,7 @@ static bool parse_notify(struct pool *pool, json_t *val)
 	bytes_resize(&pool->swork.coinbase, pool->swork.nonce2_offset + pool->swork.n2size + cb2_len);
 	bytes_resize(&pool->swork.coinbase, pool->swork.nonce2_offset + pool->swork.n2size + cb2_len);
 	uint8_t *coinbase = bytes_buf(&pool->swork.coinbase);
 	uint8_t *coinbase = bytes_buf(&pool->swork.coinbase);
 	hex2bin(coinbase, coinbase1, cb1_len);
 	hex2bin(coinbase, coinbase1, cb1_len);
-	hex2bin(&coinbase[cb1_len], pool->nonce1, pool->n1_len);
+	hex2bin(&coinbase[cb1_len], pool->swork.nonce1, pool->n1_len);
 	// NOTE: gap for nonce2, filled at work generation time
 	// NOTE: gap for nonce2, filled at work generation time
 	hex2bin(&coinbase[pool->swork.nonce2_offset + pool->swork.n2size], coinbase2, cb2_len);
 	hex2bin(&coinbase[pool->swork.nonce2_offset + pool->swork.n2size], coinbase2, cb2_len);
 	
 	
@@ -2442,8 +2442,8 @@ resend:
 	cg_wlock(&pool->data_lock);
 	cg_wlock(&pool->data_lock);
 	free(pool->sessionid);
 	free(pool->sessionid);
 	pool->sessionid = sessionid;
 	pool->sessionid = sessionid;
-	free(pool->nonce1);
-	pool->nonce1 = nonce1;
+	free(pool->swork.nonce1);
+	pool->swork.nonce1 = nonce1;
 	pool->n1_len = strlen(nonce1) / 2;
 	pool->n1_len = strlen(nonce1) / 2;
 	pool->swork.n2size = n2size;
 	pool->swork.n2size = n2size;
 	pool->nonce2sz  = (n2size > sizeof(pool->nonce2)) ? sizeof(pool->nonce2) : n2size;
 	pool->nonce2sz  = (n2size > sizeof(pool->nonce2)) ? sizeof(pool->nonce2) : n2size;
@@ -2470,7 +2470,7 @@ out:
 		pool->swork.diff = 1;
 		pool->swork.diff = 1;
 		if (opt_protocol) {
 		if (opt_protocol) {
 			applog(LOG_DEBUG, "Pool %d confirmed mining.subscribe with extranonce1 %s extran2size %d",
 			applog(LOG_DEBUG, "Pool %d confirmed mining.subscribe with extranonce1 %s extran2size %d",
-			       pool->pool_no, pool->nonce1, pool->swork.n2size);
+			       pool->pool_no, pool->swork.nonce1, pool->swork.n2size);
 		}
 		}
 	} else {
 	} else {
 		if (recvd)
 		if (recvd)