Take into account average getwork delay as a marker of pool communications when considering work stale.
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
diff --git a/cgminer.c b/cgminer.c
index c7a6d39..86ddfb0 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -2158,25 +2158,34 @@ static bool workio_get_work(struct workio_cmd *wc)
static bool stale_work(struct work *work, bool share)
{
struct timeval now;
+ time_t work_expiry;
struct pool *pool;
+ int getwork_delay;
if (work->mandatory)
return false;
+ if (share)
+ work_expiry = opt_expiry;
+ else if (work->rolls)
+ work_expiry = work->rolltime;
+ else
+ work_expiry = opt_scantime;
+ pool = work->pool;
+ /* Factor in the average getwork delay of this pool, rounding it up to
+ * the nearest second */
+ getwork_delay = pool->cgminer_pool_stats.getwork_wait_rolling * 5 + 1;
+ work_expiry -= getwork_delay;
+ if (unlikely(work_expiry < 5))
+ work_expiry = 5;
+
gettimeofday(&now, NULL);
- if (share) {
- if ((now.tv_sec - work->tv_staged.tv_sec) >= opt_expiry)
- return true;
- } else if (work->rolls) {
- if ((now.tv_sec - work->tv_staged.tv_sec) >= work->rolltime)
- return true;
- } else if ((now.tv_sec - work->tv_staged.tv_sec) >= opt_scantime)
+ if ((now.tv_sec - work->tv_staged.tv_sec) >= work_expiry)
return true;
if (work->work_block != work_block)
return true;
- pool = work->pool;
if (opt_fail_only && !share && pool != current_pool() && pool->enabled != POOL_REJECTING)
return true;