Queue multiple requests at once when levels are low.
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 83 84 85
diff --git a/cgminer.c b/cgminer.c
index 1d68349..a3d22b0 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -3529,7 +3529,7 @@ static time_t requested_tv_sec;
static bool queue_request(struct thr_info *thr, bool needed)
{
- int rq = requests_queued(), rs = requests_staged();
+ int toq, rq = requests_queued(), rs = requests_staged();
struct workio_cmd *wc;
struct timeval now;
time_t scan_post;
@@ -3549,37 +3549,46 @@ static bool queue_request(struct thr_info *thr, bool needed)
now.tv_sec - requested_tv_sec < scan_post)
return true;
- inc_queued();
-
- /* fill out work request message */
- wc = calloc(1, sizeof(*wc));
- if (unlikely(!wc)) {
- applog(LOG_ERR, "Failed to calloc wc in queue_request");
- return false;
- }
+ requested_tv_sec = now.tv_sec;
- wc->cmd = WC_GET_WORK;
- if (thr)
- wc->thr = thr;
+ if (rq > rs)
+ toq = rq - mining_threads;
else
- wc->thr = NULL;
+ toq = rs - mining_threads;
- /* If we're queueing work faster than we can stage it, consider the
- * system lagging and allow work to be gathered from another pool if
- * possible */
- if (rq && needed && !rs && !opt_fail_only)
- wc->lagging = true;
+ do {
+ inc_queued();
- applog(LOG_DEBUG, "Queueing getwork request to work thread");
+ /* fill out work request message */
+ wc = calloc(1, sizeof(*wc));
+ if (unlikely(!wc)) {
+ applog(LOG_ERR, "Failed to calloc wc in queue_request");
+ return false;
+ }
- /* send work request to workio thread */
- if (unlikely(!tq_push(thr_info[work_thr_id].q, wc))) {
- applog(LOG_ERR, "Failed to tq_push in queue_request");
- workio_cmd_free(wc);
- return false;
- }
+ wc->cmd = WC_GET_WORK;
+ if (thr)
+ wc->thr = thr;
+ else
+ wc->thr = NULL;
+
+ /* If we're queueing work faster than we can stage it, consider the
+ * system lagging and allow work to be gathered from another pool if
+ * possible */
+ if (rq && needed && !rs && !opt_fail_only)
+ wc->lagging = true;
+
+ applog(LOG_DEBUG, "Queueing getwork request to work thread");
+
+ /* send work request to workio thread */
+ if (unlikely(!tq_push(thr_info[work_thr_id].q, wc))) {
+ applog(LOG_ERR, "Failed to tq_push in queue_request");
+ workio_cmd_free(wc);
+ return false;
+ }
+
+ } while (--toq > 0);
- requested_tv_sec = now.tv_sec;
return true;
}