1
0
mirror of https://github.com/GOSTSec/sgminer synced 2025-01-11 07:17:58 +00:00

Set the read and write threads for avalon to not cancel within libusb functions and wait for the threads to pthread_join on shutdown.

This commit is contained in:
Con Kolivas 2013-05-27 21:02:32 +10:00
parent 7506e499b9
commit 7ef11e2b3d

View File

@ -751,8 +751,6 @@ static void *avalon_get_results(void *userdata)
char threadname[24]; char threadname[24];
int offset = 0; int offset = 0;
pthread_detach(pthread_self());
snprintf(threadname, 24, "ava_recv/%d", avalon->device_id); snprintf(threadname, 24, "ava_recv/%d", avalon->device_id);
RenameThread(threadname); RenameThread(threadname);
@ -771,7 +769,11 @@ static void *avalon_get_results(void *userdata)
} }
cgtime(&tv_start); cgtime(&tv_start);
/* Threads don't like being cancelled while being inside
* libusb functions */
pthread_setcanceltype(PTHREAD_CANCEL_DISABLE, NULL);
ret = avalon_read(avalon, buf, rsize, AVALON_READ_TIMEOUT); ret = avalon_read(avalon, buf, rsize, AVALON_READ_TIMEOUT);
pthread_setcanceltype(PTHREAD_CANCEL_ENABLE, NULL);
if (ret < 1) { if (ret < 1) {
int ms_delay; int ms_delay;
@ -815,8 +817,6 @@ static void *avalon_send_tasks(void *userdata)
const int avalon_get_work_count = info->miner_count; const int avalon_get_work_count = info->miner_count;
char threadname[24]; char threadname[24];
pthread_detach(pthread_self());
snprintf(threadname, 24, "ava_send/%d", avalon->device_id); snprintf(threadname, 24, "ava_send/%d", avalon->device_id);
RenameThread(threadname); RenameThread(threadname);
@ -850,7 +850,11 @@ static void *avalon_send_tasks(void *userdata)
info->timeout, info->asic_count, info->timeout, info->asic_count,
info->miner_count, 1, 1, info->frequency); info->miner_count, 1, 1, info->frequency);
} }
pthread_setcanceltype(PTHREAD_CANCEL_DISABLE, NULL);
ret = avalon_send_task(&at, avalon); ret = avalon_send_task(&at, avalon);
pthread_setcanceltype(PTHREAD_CANCEL_ENABLE, NULL);
if (unlikely(ret == AVA_SEND_ERROR)) { if (unlikely(ret == AVA_SEND_ERROR)) {
applog(LOG_ERR, "AVA%i: Comms error(buffer)", applog(LOG_ERR, "AVA%i: Comms error(buffer)",
avalon->device_id); avalon->device_id);
@ -939,11 +943,12 @@ static void do_avalon_close(struct thr_info *thr)
struct avalon_info *info = avalon->device_data; struct avalon_info *info = avalon->device_data;
pthread_cancel(info->read_thr); pthread_cancel(info->read_thr);
pthread_join(info->read_thr, NULL);
pthread_cancel(info->write_thr); pthread_cancel(info->write_thr);
pthread_join(info->write_thr, NULL);
__avalon_running_reset(avalon, info); __avalon_running_reset(avalon, info);
avalon_idle(avalon, info); avalon_idle(avalon, info);
avalon_free_work(thr); avalon_free_work(thr);
//avalon_close();
info->no_matching_work = 0; info->no_matching_work = 0;
} }