Commit e1d7ecdd35a5b355b600ed99ed335b5107f9179e

Con Kolivas 2012-12-29T09:45:40

Do not try to generate stratum work unless the notify command has succeeded.

diff --git a/cgminer.c b/cgminer.c
index 07a78e5..e17334f 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -4623,6 +4623,15 @@ static void wait_lpcurrent(struct pool *pool);
 static void pool_resus(struct pool *pool);
 static void gen_stratum_work(struct pool *pool, struct work *work);
 
+static void stratum_resumed(struct pool *pool)
+{
+	if (!pool->stratum_notify)
+		return;
+	applog(LOG_INFO, "Stratum connection to pool %d resumed", pool->pool_no);
+	pool_tclear(pool, &pool->idle);
+	pool_resus(pool);
+}
+
 /* One stratum thread per pool that has stratum waits on the socket checking
  * for new messages and for the integrity of the socket connection. We reset
  * the connection based on the integrity of the receive side only as the send
@@ -4697,18 +4706,13 @@ static void *stratum_thread(void *userdata)
 					goto out;
 				sleep(30);
 			}
-			applog(LOG_INFO, "Stratum connection to pool %d resumed", pool->pool_no);
-			pool_tclear(pool, &pool->idle);
-			pool_resus(pool);
+			stratum_resumed(pool);
 			continue;
 		}
 
 		/* Check this pool hasn't died while being a backup pool and
 		 * has not had its idle flag cleared */
-		if (pool_tclear(pool, &pool->idle)) {
-			applog(LOG_INFO, "Stratum connection to pool %d resumed", pool->pool_no);
-			pool_resus(pool);
-		}
+		stratum_resumed(pool);
 
 		if (!parse_method(pool, s) && !parse_stratum_response(pool, s))
 			applog(LOG_INFO, "Unknown stratum msg: %s", s);
diff --git a/miner.h b/miner.h
index f777a30..50ed607 100644
--- a/miner.h
+++ b/miner.h
@@ -937,6 +937,7 @@ struct pool {
 	bool has_stratum;
 	bool stratum_active;
 	bool stratum_auth;
+	bool stratum_notify;
 	struct stratum_work swork;
 	pthread_t stratum_thread;
 	pthread_mutex_t stratum_lock;
diff --git a/util.c b/util.c
index 74270d5..82b1fa3 100644
--- a/util.c
+++ b/util.c
@@ -1055,13 +1055,13 @@ static char *json_array_string(json_t *val, unsigned int entry)
 static bool parse_notify(struct pool *pool, json_t *val)
 {
 	char *job_id, *prev_hash, *coinbase1, *coinbase2, *bbversion, *nbit, *ntime;
+	bool clean, ret = false;
 	int merkles, i;
 	json_t *arr;
-	bool clean;
 
 	arr = json_array_get(val, 4);
 	if (!arr || !json_is_array(arr))
-		return false;
+		goto out;
 
 	merkles = json_array_size(arr);
 
@@ -1090,7 +1090,7 @@ static bool parse_notify(struct pool *pool, json_t *val)
 			free(nbit);
 		if (ntime)
 			free(ntime);
-		return false;
+		goto out;
 	}
 
 	mutex_lock(&pool->pool_lock);
@@ -1137,7 +1137,9 @@ static bool parse_notify(struct pool *pool, json_t *val)
 	/* A notify message is the closest stratum gets to a getwork */
 	pool->getwork_requested++;
 	total_getworks++;
-	return true;
+	ret = true;
+out:
+	return ret;
 }
 
 static bool parse_diff(struct pool *pool, json_t *val)
@@ -1241,8 +1243,11 @@ bool parse_method(struct pool *pool, char *s)
 	if (!buf)
 		goto out;
 
-	if (!strncasecmp(buf, "mining.notify", 13) && parse_notify(pool, params)) {
-		ret = true;
+	if (!strncasecmp(buf, "mining.notify", 13)) {
+		if (parse_notify(pool, params))
+			pool->stratum_notify = ret = true;
+		else
+			pool->stratum_notify = ret = false;
 		goto out;
 	}
 
@@ -1308,6 +1313,10 @@ bool auth_stratum(struct pool *pool)
 
 		goto out;
 	}
+
+	if (!pool->stratum_notify)
+		goto out;
+
 	ret = true;
 	applog(LOG_INFO, "Stratum authorisation success for pool %d", pool->pool_no);
 	pool->probed = true;