Commit 9f726400d42790568464daa0bc91cf56540a07e0

Con Kolivas 2011-07-02T21:42:14

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.

diff --git a/cpu-miner.c b/cpu-miner.c
index 72e0a6d..d3527e1 100644
--- a/cpu-miner.c
+++ b/cpu-miner.c
@@ -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:
 	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;
 		}
 	}