Commit de28944328577482c6d6ecb1dea529edcce0781c

Con Kolivas 2013-03-08T20:52:54

Revert "Rollback breakage to 81567e515707891837f52bc3aac7d5916dfff5a2" This reverts commit a8863995dee7bcd089e1aa9a3b86cd5c749d0d65. This should work now...

diff --git a/cgminer.c b/cgminer.c
index 2bd213c..899bed8 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -2618,11 +2618,23 @@ static struct pool *select_balanced(struct pool *cp)
 	return ret;
 }
 
+static bool pool_unusable(struct pool *pool)
+{
+	if (pool->idle)
+		return true;
+	if (pool->enabled != POOL_ENABLED)
+		return true;
+	if (pool->has_stratum && !pool->stratum_active)
+		return true;
+	return false;
+}
+
 /* Select any active pool in a rotating fashion when loadbalance is chosen */
 static inline struct pool *select_pool(bool lagging)
 {
 	static int rotating_pool = 0;
 	struct pool *pool, *cp;
+	int tested;
 
 	cp = current_pool();
 
@@ -2634,14 +2646,19 @@ static inline struct pool *select_pool(bool lagging)
 	else
 		pool = NULL;
 
-	while (!pool) {
+	/* Try to find the first pool in the rotation that is usable */
+	tested = 0;
+	while (!pool && tested++ < total_pools) {
 		if (++rotating_pool >= total_pools)
 			rotating_pool = 0;
 		pool = pools[rotating_pool];
-		if ((!pool->idle && pool->enabled == POOL_ENABLED) || pool == cp)
+		if (!pool_unusable(pool))
 			break;
 		pool = NULL;
 	}
+	/* If still nothing is usable, use the current pool */
+	if (!pool)
+		pool = cp;
 
 	return pool;
 }
@@ -3386,10 +3403,10 @@ void switch_pools(struct pool *selected)
 		case POOL_LOADBALANCE:
 			for (i = 0; i < total_pools; i++) {
 				pool = priority_pool(i);
-				if (!pool->idle && pool->enabled == POOL_ENABLED) {
-					pool_no = pool->pool_no;
-					break;
-				}
+				if (pool_unusable(pool) && pool != selected)
+					continue;
+				pool_no = pool->pool_no;
+				break;
 			}
 			break;
 		/* Both of these simply increment and cycle */
@@ -3406,10 +3423,10 @@ void switch_pools(struct pool *selected)
 				if (next_pool >= total_pools)
 					next_pool = 0;
 				pool = pools[next_pool];
-				if (!pool->idle && pool->enabled == POOL_ENABLED) {
-					pool_no = next_pool;
-					break;
-				}
+				if (pool_unusable(pool) && pool != selected)
+					continue;
+				pool_no = next_pool;
+				break;
 			}
 			break;
 		default: