diff --git a/cgminer.c b/cgminer.c index 92f9ad8d..4f88f9fd 100644 --- a/cgminer.c +++ b/cgminer.c @@ -4331,6 +4331,24 @@ static void *watchpool_thread(void __maybe_unused *userdata) return NULL; } +/* Work is sorted according to age, so discard the oldest work items, leaving + * only 1 staged work item per mining thread */ +static void age_work(void) +{ + int discarded = 0; + + while (requests_staged() > mining_threads * 4 / 3 + opt_queue) { + struct work *work = hash_pop(NULL); + + if (unlikely(!work)) + break; + discard_work(work); + discarded++; + } + if (discarded) + applog(LOG_DEBUG, "Aged %d work items", discarded); +} + /* Makes sure the hashmeter keeps going even if mining threads stall, updates * the screen at regular intervals, and restarts threads if they appear to have * died. */ @@ -4352,6 +4370,8 @@ static void *watchdog_thread(void __maybe_unused *userdata) if (requests_queued() < opt_queue) queue_request(NULL, false); + age_work(); + hashmeter(-1, &zero_tv, 0); #ifdef HAVE_CURSES