The can_roll function fails inappropriately in stale_work.
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 74 75 76 77 78 79 80 81 82
diff --git a/main.c b/main.c
index 7b12fd5..d0f9c7c 100644
--- a/main.c
+++ b/main.c
@@ -1289,15 +1289,18 @@ static bool workio_get_work(struct workio_cmd *wc)
return true;
}
-static bool stale_work(struct work *work)
+static bool stale_work(struct work *work, bool rolling)
{
- struct timeval now;
bool ret = false;
char *hexstr;
- gettimeofday(&now, NULL);
- if ((now.tv_sec - work->tv_staged.tv_sec) > opt_scantime)
- return true;
+ if (!rolling) {
+ struct timeval now;
+
+ gettimeofday(&now, NULL);
+ if ((now.tv_sec - work->tv_staged.tv_sec) > opt_scantime)
+ return true;
+ }
/* Only use the primary pool for determination as the work may
* interleave at times of new blocks */
@@ -1326,7 +1329,7 @@ static void *submit_work_thread(void *userdata)
pthread_detach(pthread_self());
- if (stale_work(work)) {
+ if (stale_work(work, false)) {
applog(LOG_WARNING, "Stale share detected, discarding");
total_stale++;
pool->stale_shares++;
@@ -1335,7 +1338,7 @@ static void *submit_work_thread(void *userdata)
/* submit solution to bitcoin via JSON-RPC */
while (!submit_upstream_work(work)) {
- if (stale_work(work)) {
+ if (stale_work(work, false)) {
applog(LOG_WARNING, "Stale share detected, discarding");
total_stale++;
pool->stale_shares++;
@@ -2412,7 +2415,7 @@ static void flush_requests(void)
static inline bool can_roll(struct work *work)
{
- return (work->pool && !stale_work(work) && work->pool->has_rolltime &&
+ return (work->pool && !stale_work(work, true) && work->pool->has_rolltime &&
work->rolls < 11 && !work->clone);
}
@@ -2520,7 +2523,7 @@ retry:
goto retry;
}
- if (stale_work(work_heap)) {
+ if (stale_work(work_heap, false)) {
dec_queued();
discard_work(work_heap);
goto retry;
@@ -2826,7 +2829,7 @@ static void *miner_thread(void *userdata)
decay_time(&hash_divfloat , (double)((MAXTHREADS / total_hashes) ? : 1));
hash_div = hash_divfloat;
needs_work = true;
- } else if (work_restart[thr_id].restart || stale_work(work) ||
+ } else if (work_restart[thr_id].restart || stale_work(work, false) ||
work->blk.nonce >= MAXTHREADS - hashes_done)
needs_work = true;
}
@@ -3051,7 +3054,7 @@ static void *gpuminer_thread(void *userdata)
if (diff.tv_sec > opt_scantime ||
work->blk.nonce >= MAXTHREADS - hashes ||
work_restart[thr_id].restart ||
- stale_work(work)) {
+ stale_work(work, false)) {
/* Ignore any reads since we're getting new work and queue a clean buffer */
status = clEnqueueWriteBuffer(clState->commandQueue, clState->outputBuffer, CL_FALSE, 0,
BUFFERSIZE, blank_res, 0, NULL, NULL);