|
|
|
@ -2436,6 +2436,42 @@ err_out:
@@ -2436,6 +2436,42 @@ err_out:
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
struct swa { |
|
|
|
|
struct thr_info *thr; |
|
|
|
|
const struct work *work_in; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static void *swasync_thread(void *userdata) |
|
|
|
|
{ |
|
|
|
|
struct swa *swa = (struct swa *)userdata; |
|
|
|
|
|
|
|
|
|
/* Return value ignored */ |
|
|
|
|
submit_work_sync(swa->thr, swa->work_in); |
|
|
|
|
free(swa); |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static bool submit_work_async(struct thr_info *thr, const struct work *work_in) |
|
|
|
|
{ |
|
|
|
|
pthread_t sw_thread; |
|
|
|
|
struct swa *swa; |
|
|
|
|
|
|
|
|
|
swa = malloc(sizeof(struct swa)); |
|
|
|
|
if (unlikely(!swa)) { |
|
|
|
|
applog(LOG_ERR, "Failed to malloc swa in submit_work_async"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
swa->thr = thr; |
|
|
|
|
swa->work_in = work_in; |
|
|
|
|
|
|
|
|
|
if (unlikely(pthread_create(&sw_thread, NULL, swasync_thread, (void *)swa))) { |
|
|
|
|
applog(LOG_ERR, "Failed to create swasync_thread"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool submit_nonce(struct thr_info *thr, struct work *work, uint32_t nonce) |
|
|
|
|
{ |
|
|
|
|
work->data[64+12+0] = (nonce>>0) & 0xff; |
|
|
|
@ -2608,7 +2644,7 @@ static void *miner_thread(void *userdata)
@@ -2608,7 +2644,7 @@ static void *miner_thread(void *userdata)
|
|
|
|
|
if (unlikely(rc)) { |
|
|
|
|
if (opt_debug) |
|
|
|
|
applog(LOG_DEBUG, "CPU %d found something?", dev_from_id(thr_id)); |
|
|
|
|
if (unlikely(!submit_work_sync(mythr, &work))) { |
|
|
|
|
if (unlikely(!submit_work_async(mythr, &work))) { |
|
|
|
|
applog(LOG_ERR, "Failed to submit_work_sync in miner_thread %d", thr_id); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|