|
|
@ -925,7 +925,7 @@ static bool submit_upstream_work(const struct work *work) |
|
|
|
hexstr); |
|
|
|
hexstr); |
|
|
|
|
|
|
|
|
|
|
|
if (opt_debug) |
|
|
|
if (opt_debug) |
|
|
|
applog(LOG_DEBUG, "DBG: sending RPC call: %s", s); |
|
|
|
applog(LOG_DEBUG, "DBG: sending %s submit RPC call: %s", pool->rpc_url, s); |
|
|
|
|
|
|
|
|
|
|
|
/* issue JSON-RPC request */ |
|
|
|
/* issue JSON-RPC request */ |
|
|
|
val = json_rpc_call(curl, pool->rpc_url, pool->rpc_userpass, s, false, false, pool); |
|
|
|
val = json_rpc_call(curl, pool->rpc_url, pool->rpc_userpass, s, false, false, pool); |
|
|
@ -1036,6 +1036,9 @@ static bool get_upstream_work(struct work *work, bool lagging) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
pool = select_pool(lagging); |
|
|
|
pool = select_pool(lagging); |
|
|
|
|
|
|
|
if (opt_debug) |
|
|
|
|
|
|
|
applog(LOG_DEBUG, "DBG: sending %s get RPC call: %s", pool->rpc_url, rpc_req); |
|
|
|
|
|
|
|
|
|
|
|
val = json_rpc_call(curl, pool->rpc_url, pool->rpc_userpass, rpc_req, |
|
|
|
val = json_rpc_call(curl, pool->rpc_url, pool->rpc_userpass, rpc_req, |
|
|
|
want_longpoll, false, pool); |
|
|
|
want_longpoll, false, pool); |
|
|
|
if (unlikely(!val)) { |
|
|
|
if (unlikely(!val)) { |
|
|
@ -1140,6 +1143,9 @@ void kill_work(void) |
|
|
|
wc->cmd = WC_DIE; |
|
|
|
wc->cmd = WC_DIE; |
|
|
|
wc->thr = 0; |
|
|
|
wc->thr = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (opt_debug) |
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Pushing die request to work thread"); |
|
|
|
|
|
|
|
|
|
|
|
if (unlikely(!tq_push(thr_info[work_thr_id].q, wc))) { |
|
|
|
if (unlikely(!tq_push(thr_info[work_thr_id].q, wc))) { |
|
|
|
applog(LOG_ERR, "Failed to tq_push work in kill_work"); |
|
|
|
applog(LOG_ERR, "Failed to tq_push work in kill_work"); |
|
|
|
exit (1); |
|
|
|
exit (1); |
|
|
@ -1183,6 +1189,9 @@ static void *get_work_thread(void *userdata) |
|
|
|
sleep(opt_fail_pause); |
|
|
|
sleep(opt_fail_pause); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (opt_debug) |
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Pushing work to requesting thread"); |
|
|
|
|
|
|
|
|
|
|
|
/* send work to requesting thread */ |
|
|
|
/* send work to requesting thread */ |
|
|
|
if (unlikely(!tq_push(thr_info[stage_thr_id].q, ret_work))) { |
|
|
|
if (unlikely(!tq_push(thr_info[stage_thr_id].q, ret_work))) { |
|
|
|
applog(LOG_ERR, "Failed to tq_push work in workio_get_work"); |
|
|
|
applog(LOG_ERR, "Failed to tq_push work in workio_get_work"); |
|
|
@ -1478,6 +1487,9 @@ static void *stage_thread(void *userdata) |
|
|
|
if (!work->cloned && !work->clone) |
|
|
|
if (!work->cloned && !work->clone) |
|
|
|
gettimeofday(&work->tv_staged, NULL); |
|
|
|
gettimeofday(&work->tv_staged, NULL); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (opt_debug) |
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Pushing work to getwork queue"); |
|
|
|
|
|
|
|
|
|
|
|
if (unlikely(!tq_push(getq, 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; |
|
|
@ -1895,6 +1907,9 @@ retry: |
|
|
|
if (dev_from_id(i) != selected) |
|
|
|
if (dev_from_id(i) != selected) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
thr = &thr_info[i]; |
|
|
|
thr = &thr_info[i]; |
|
|
|
|
|
|
|
if (opt_debug) |
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Pushing ping to thread %d", thr->id); |
|
|
|
|
|
|
|
|
|
|
|
tq_push(thr->q, &ping); |
|
|
|
tq_push(thr->q, &ping); |
|
|
|
} |
|
|
|
} |
|
|
|
} if (!strncasecmp(&input, "d", 1)) { |
|
|
|
} if (!strncasecmp(&input, "d", 1)) { |
|
|
@ -2143,6 +2158,9 @@ static bool pool_active(struct pool *pool) |
|
|
|
applog(LOG_DEBUG, "Successfully retrieved and deciphered work from pool %u %s", |
|
|
|
applog(LOG_DEBUG, "Successfully retrieved and deciphered work from pool %u %s", |
|
|
|
pool->pool_no, pool->rpc_url); |
|
|
|
pool->pool_no, pool->rpc_url); |
|
|
|
work->pool = pool; |
|
|
|
work->pool = pool; |
|
|
|
|
|
|
|
if (opt_debug) |
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Pushing pooltest work to base pool"); |
|
|
|
|
|
|
|
|
|
|
|
tq_push(thr_info[stage_thr_id].q, work); |
|
|
|
tq_push(thr_info[stage_thr_id].q, work); |
|
|
|
total_getworks++; |
|
|
|
total_getworks++; |
|
|
|
pool->getwork_requested++; |
|
|
|
pool->getwork_requested++; |
|
|
@ -2210,6 +2228,9 @@ static bool queue_request(void) |
|
|
|
if (rq > (maxq * 2 / 3) && !rs) |
|
|
|
if (rq > (maxq * 2 / 3) && !rs) |
|
|
|
wc->lagging = true; |
|
|
|
wc->lagging = true; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (opt_debug) |
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Queueing getwork request to work thread"); |
|
|
|
|
|
|
|
|
|
|
|
/* 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))) { |
|
|
|
applog(LOG_ERR, "Failed to tq_push in queue_request"); |
|
|
|
applog(LOG_ERR, "Failed to tq_push in queue_request"); |
|
|
@ -2413,6 +2434,9 @@ retry: |
|
|
|
* should we divide the same work up again. Make the work we're |
|
|
|
* should we divide the same work up again. Make the work we're |
|
|
|
* handing out be clone */ |
|
|
|
* handing out be clone */ |
|
|
|
if (divide_work(&now, work_heap, hash_div)) { |
|
|
|
if (divide_work(&now, work_heap, hash_div)) { |
|
|
|
|
|
|
|
if (opt_debug) |
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Pushing divided work to get queue head"); |
|
|
|
|
|
|
|
|
|
|
|
tq_push_head(getq, work_heap); |
|
|
|
tq_push_head(getq, work_heap); |
|
|
|
work->clone = true; |
|
|
|
work->clone = true; |
|
|
|
} else { |
|
|
|
} else { |
|
|
@ -2458,6 +2482,9 @@ static bool submit_work_sync(struct thr_info *thr, const struct work *work_in) |
|
|
|
wc->thr = thr; |
|
|
|
wc->thr = thr; |
|
|
|
memcpy(wc->u.work, work_in, sizeof(*work_in)); |
|
|
|
memcpy(wc->u.work, work_in, sizeof(*work_in)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (opt_debug) |
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Pushing submit work to work thread"); |
|
|
|
|
|
|
|
|
|
|
|
/* send solution to workio thread */ |
|
|
|
/* send solution 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))) { |
|
|
|
applog(LOG_ERR, "Failed to tq_push work in submit_work_sync"); |
|
|
|
applog(LOG_ERR, "Failed to tq_push work in submit_work_sync"); |
|
|
@ -2931,6 +2958,8 @@ static void *gpuminer_thread(void *userdata) |
|
|
|
memset(res, 0, BUFFERSIZE); |
|
|
|
memset(res, 0, BUFFERSIZE); |
|
|
|
|
|
|
|
|
|
|
|
gettimeofday(&tv_workstart, NULL); |
|
|
|
gettimeofday(&tv_workstart, NULL); |
|
|
|
|
|
|
|
if (opt_debug) |
|
|
|
|
|
|
|
applog(LOG_DEBUG, "getwork thread %d", thr_id); |
|
|
|
/* obtain new work from internal workio thread */ |
|
|
|
/* obtain new work from internal workio thread */ |
|
|
|
if (unlikely(!get_work(work, requested, mythr, thr_id, hash_div))) { |
|
|
|
if (unlikely(!get_work(work, requested, mythr, thr_id, hash_div))) { |
|
|
|
applog(LOG_ERR, "work retrieval failed, exiting " |
|
|
|
applog(LOG_ERR, "work retrieval failed, exiting " |
|
|
@ -2943,8 +2972,6 @@ static void *gpuminer_thread(void *userdata) |
|
|
|
precalc_hash(&work->blk, (uint32_t *)(work->midstate), (uint32_t *)(work->data + 64)); |
|
|
|
precalc_hash(&work->blk, (uint32_t *)(work->midstate), (uint32_t *)(work->data + 64)); |
|
|
|
work_restart[thr_id].restart = 0; |
|
|
|
work_restart[thr_id].restart = 0; |
|
|
|
|
|
|
|
|
|
|
|
if (opt_debug) |
|
|
|
|
|
|
|
applog(LOG_DEBUG, "getwork thread %d", thr_id); |
|
|
|
|
|
|
|
/* Flushes the writebuffer set with CL_FALSE above */ |
|
|
|
/* Flushes the writebuffer set with CL_FALSE above */ |
|
|
|
clFinish(clState->commandQueue); |
|
|
|
clFinish(clState->commandQueue); |
|
|
|
} |
|
|
|
} |
|
|
@ -3052,6 +3079,9 @@ static void convert_to_work(json_t *val) |
|
|
|
} |
|
|
|
} |
|
|
|
work->pool = current_pool(); |
|
|
|
work->pool = current_pool(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (opt_debug) |
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Pushing converted work to stage thread"); |
|
|
|
|
|
|
|
|
|
|
|
if (unlikely(!tq_push(thr_info[stage_thr_id].q, work))) |
|
|
|
if (unlikely(!tq_push(thr_info[stage_thr_id].q, work))) |
|
|
|
applog(LOG_ERR, "Could not tq_push work in convert_to_work"); |
|
|
|
applog(LOG_ERR, "Could not tq_push work in convert_to_work"); |
|
|
|
else if (opt_debug) |
|
|
|
else if (opt_debug) |
|
|
@ -3255,6 +3285,9 @@ static void *reinit_gpu(void *userdata) |
|
|
|
} |
|
|
|
} |
|
|
|
/* Try to re-enable it */ |
|
|
|
/* Try to re-enable it */ |
|
|
|
gpu_devices[gpu] = true; |
|
|
|
gpu_devices[gpu] = true; |
|
|
|
|
|
|
|
if (opt_debug) |
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Pushing ping to thread %d", thr_id); |
|
|
|
|
|
|
|
|
|
|
|
tq_push(thr->q, &ping); |
|
|
|
tq_push(thr->q, &ping); |
|
|
|
|
|
|
|
|
|
|
|
applog(LOG_WARNING, "Thread %d restarted", thr_id); |
|
|
|
applog(LOG_WARNING, "Thread %d restarted", thr_id); |
|
|
@ -3799,8 +3832,12 @@ int main (int argc, char *argv[]) |
|
|
|
|
|
|
|
|
|
|
|
/* Enable threads for devices set not to mine but disable
|
|
|
|
/* Enable threads for devices set not to mine but disable
|
|
|
|
* their queue in case we wish to enable them later*/ |
|
|
|
* their queue in case we wish to enable them later*/ |
|
|
|
if (gpu_devices[gpu]) |
|
|
|
if (gpu_devices[gpu]) { |
|
|
|
|
|
|
|
if (opt_debug) |
|
|
|
|
|
|
|
applog(LOG_DEBUG, "Pushing ping to thread %d", thr->id); |
|
|
|
|
|
|
|
|
|
|
|
tq_push(thr->q, &ping); |
|
|
|
tq_push(thr->q, &ping); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
applog(LOG_INFO, "Init GPU thread %i", i); |
|
|
|
applog(LOG_INFO, "Init GPU thread %i", i); |
|
|
|
clStates[i] = initCl(gpu, name, sizeof(name)); |
|
|
|
clStates[i] = initCl(gpu, name, sizeof(name)); |
|
|
|