Selectively discard all work items if a longpoll or stratum restart is received without a new block to work on.
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
diff --git a/cgminer.c b/cgminer.c
index c7e913e..70c7d5e 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -3318,14 +3318,14 @@ static void wake_gws(void)
mutex_unlock(stgd_lock);
}
-static void discard_stale(void)
+static void discard_stale(bool all)
{
struct work *work, *tmp;
int stale = 0;
mutex_lock(stgd_lock);
HASH_ITER(hh, staged_work, work, tmp) {
- if (stale_work(work, false)) {
+ if (all || stale_work(work, false)) {
HASH_DEL(staged_work, work);
discard_work(work);
stale++;
@@ -3363,7 +3363,7 @@ int restart_wait(unsigned int mstime)
return rc;
}
-static void restart_threads(void)
+static void restart_threads(bool all)
{
struct pool *cp = current_pool();
int i;
@@ -3373,7 +3373,7 @@ static void restart_threads(void)
pool_tset(cp, &cp->lagging);
/* Discard staged work that is now stale */
- discard_stale();
+ discard_stale(all);
for (i = 0; i < mining_threads; i++)
thr_info[i].work_restart = true;
@@ -3497,13 +3497,13 @@ static bool test_work_current(struct work *work)
else
applog(LOG_NOTICE, "New block detected on network");
}
- restart_threads();
+ restart_threads(false);
} else if (work->longpoll) {
work->work_block = ++work_block;
if (work->pool == current_pool()) {
applog(LOG_NOTICE, "%sLONGPOLL from pool %d requested work restart",
work->gbt ? "GBT " : "", work->pool->pool_no);
- restart_threads();
+ restart_threads(true);
}
}
work->longpoll = false;
@@ -4616,7 +4616,7 @@ static void *stratum_thread(void *userdata)
/* Only accept a work restart if this stratum
* connection is from the current pool */
if (pool == current_pool()) {
- restart_threads();
+ restart_threads(true);
applog(LOG_NOTICE, "Stratum from pool %d requested work restart", pool->pool_no);
}
} else
@@ -5700,7 +5700,7 @@ static void *watchdog_thread(void __maybe_unused *userdata)
sleep(interval);
- discard_stale();
+ discard_stale(false);
hashmeter(-1, &zero_tv, 0);