Browse Source

Create a unique get work queue instead of faking it all to thread 0.

nfactor-troky
Con Kolivas 14 years ago
parent
commit
3cb7ef2b07
  1. 23
      main.c

23
main.c

@ -188,6 +188,8 @@ static char datestamp[40];
struct sigaction termhandler, inthandler; struct sigaction termhandler, inthandler;
struct thread_q *getq;
static void applog_and_exit(const char *fmt, ...) static void applog_and_exit(const char *fmt, ...)
{ {
va_list ap; va_list ap;
@ -1019,7 +1021,7 @@ static void *stage_thread(void *userdata)
memcpy(current_block, hexstr, 36); memcpy(current_block, hexstr, 36);
free(hexstr); free(hexstr);
if (unlikely(!tq_push(thr_info[0].q, work))) { if (unlikely(!tq_push(getq, work))) {
applog(LOG_ERR, "Failed to tq_push work in stage_thread"); applog(LOG_ERR, "Failed to tq_push work in stage_thread");
ok = false; ok = false;
break; break;
@ -1163,11 +1165,8 @@ static int requests_queued(void)
return ret; return ret;
} }
/* All work is queued flagged as being for thread 0 and then the mining thread
* flags it as its own */
static bool queue_request(void) static bool queue_request(void)
{ {
struct thr_info *thr = &thr_info[0];
struct workio_cmd *wc; struct workio_cmd *wc;
/* If we've been generating lots of local work we may already have /* If we've been generating lots of local work we may already have
@ -1183,7 +1182,8 @@ static bool queue_request(void)
} }
wc->cmd = WC_GET_WORK; wc->cmd = WC_GET_WORK;
wc->thr = thr; /* The get work does not belong to any thread */
wc->thr = NULL;
/* send work request to workio thread */ /* send work request to workio thread */
if (unlikely(!tq_push(thr_info[work_thr_id].q, wc))) { if (unlikely(!tq_push(thr_info[work_thr_id].q, wc))) {
@ -1198,7 +1198,6 @@ static bool queue_request(void)
static bool discard_request(void) static bool discard_request(void)
{ {
struct thr_info *thr = &thr_info[0];
struct work *work_heap; struct work *work_heap;
/* Just in case we fell in a hole and missed a queue filling */ /* Just in case we fell in a hole and missed a queue filling */
@ -1207,7 +1206,7 @@ static bool discard_request(void)
return true; return true;
} }
work_heap = tq_pop(thr->q, NULL); work_heap = tq_pop(getq, NULL);
if (unlikely(!work_heap)) { if (unlikely(!work_heap)) {
applog(LOG_ERR, "Failed to tq_pop in discard_request"); applog(LOG_ERR, "Failed to tq_pop in discard_request");
return false; return false;
@ -1255,7 +1254,6 @@ static void flush_requests(bool longpoll)
static bool get_work(struct work *work, bool queued) static bool get_work(struct work *work, bool queued)
{ {
static struct timeval tv_localgen = {}; static struct timeval tv_localgen = {};
struct thr_info *thr = &thr_info[0];
struct work *work_heap; struct work *work_heap;
bool ret = false; bool ret = false;
int failures = 0; int failures = 0;
@ -1300,7 +1298,7 @@ retry:
} }
/* wait for 1st response, or get cached response */ /* wait for 1st response, or get cached response */
work_heap = tq_pop(thr->q, NULL); work_heap = tq_pop(getq, NULL);
if (unlikely(!work_heap)) { if (unlikely(!work_heap)) {
applog(LOG_WARNING, "Failed to tq_pop in get_work"); applog(LOG_WARNING, "Failed to tq_pop in get_work");
goto out; goto out;
@ -2276,6 +2274,13 @@ int main (int argc, char *argv[])
* actually put something into the queue */ * actually put something into the queue */
inc_staged(mining_threads, true); inc_staged(mining_threads, true);
/* Create a unique get work queue */
getq = tq_new();
if (!getq) {
applog(LOG_ERR, "Failed to create getq");
return 1;
}
#ifdef HAVE_OPENCL #ifdef HAVE_OPENCL
i = 0; i = 0;

Loading…
Cancel
Save