Commit 927730ae2c96f596e60ef3dbc6e79084b3984e6c

Con Kolivas 2012-12-08T21:27:40

Stage extra work when the primary pool is a getwork pool without rolltime.

diff --git a/cgminer.c b/cgminer.c
index 4a14fb3..9f84b67 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -3052,14 +3052,19 @@ static void *getwork_thread(void __maybe_unused *userdata)
 	RenameThread("getwork_sched");
 
 	while (42) {
+		int ts, max_staged = opt_queue;
 		struct pool *pool, *cp;
 		bool lagging = false;
 		struct curl_ent *ce;
 		struct work *work;
-		int ts;
 
 		cp = current_pool();
 
+		/* If the primary pool is a getwork pool and cannot roll work,
+		 * try to stage one extra work per mining thread */
+		if (!cp->has_stratum && !cp->has_gbt && !staged_rollable)
+			max_staged += mining_threads;
+
 		mutex_lock(stgd_lock);
 		ts = __total_staged();
 
@@ -3067,12 +3072,13 @@ static void *getwork_thread(void __maybe_unused *userdata)
 			lagging = true;
 
 		/* Wait until hash_pop tells us we need to create more work */
-		if (ts > opt_queue) {
+		if (ts > max_staged) {
 			pthread_cond_wait(&gws_cond, stgd_lock);
 			ts = __total_staged();
 		}
 		mutex_unlock(stgd_lock);
-		if (ts > opt_queue)
+
+		if (ts > max_staged)
 			continue;
 
 		work = make_work();