Browse Source

Logic error in the queueing of work ended up generating more stale blocks.

There is a small chance that a longpoll is signalled right at the start which would lead to a deadlock so check for first work before restart.
nfactor-troky
Con Kolivas 13 years ago
parent
commit
9f726400d4
  1. 29
      cpu-miner.c

29
cpu-miner.c

@ -728,7 +728,6 @@ static bool get_work(struct work *work) @@ -728,7 +728,6 @@ static bool get_work(struct work *work)
bool ret = false;
unsigned int i;
get_new:
if (unlikely(!queue_request()))
goto out;
@ -737,31 +736,29 @@ get_new: @@ -737,31 +736,29 @@ get_new:
if (unlikely(!work_heap))
goto out;
if (unlikely(first_work)) {
first_work = false;
/* send for extra work requests for the next time get_work
* is called. */
for (i = 1; i < opt_queue; i++) {
if (unlikely(!queue_request()))
goto out_free;
}
}
if (unlikely(work_restart[opt_n_threads + gpu_threads].restart)) {
work_restart[opt_n_threads + gpu_threads].restart = 0;
free(work_heap);
if (opt_debug)
applog(LOG_DEBUG, "New block detected, discarding old work");
for (i = 1; i < opt_queue; i++) {
free(work_heap);
if (unlikely(!queue_request()))
goto out;
/* Pop off all the work. Cancelling the requests would
* be better but tricky. */
work_heap = tq_pop(thr->q, NULL);
if (unlikely(!work_heap))
goto out;
free(work_heap);
if (unlikely(!queue_request()))
goto out;
}
goto get_new;
}
if (unlikely(first_work)) {
first_work = false;
/* send for extra work requests for the next time get_work
* is called. */
for (i = 1; i < opt_queue; i++) {
if (unlikely(!queue_request()))
goto out_free;
}
}

Loading…
Cancel
Save