Stage extra work when the primary pool is a getwork pool without rolltime.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
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();