Browse Source

Fix avalon shutdown sequence.

nfactor-troky
Con Kolivas 12 years ago
parent
commit
5900c0244d
  1. 32
      driver-avalon.c

32
driver-avalon.c

@ -769,11 +769,7 @@ 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 us_delay; int us_delay;
@ -827,6 +823,7 @@ static void *avalon_send_tasks(void *userdata)
wait_avalon_ready(avalon); wait_avalon_ready(avalon);
pthread_setcanceltype(PTHREAD_CANCEL_DISABLE, NULL);
mutex_lock(&info->qlock); mutex_lock(&info->qlock);
start_count = avalon->work_array * avalon_get_work_count; start_count = avalon->work_array * avalon_get_work_count;
end_count = start_count + avalon_get_work_count; end_count = start_count + avalon_get_work_count;
@ -851,9 +848,7 @@ static void *avalon_send_tasks(void *userdata)
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)",
@ -867,6 +862,7 @@ static void *avalon_send_tasks(void *userdata)
avalon_rotate_array(avalon); avalon_rotate_array(avalon);
pthread_cond_signal(&info->qcond); pthread_cond_signal(&info->qcond);
mutex_unlock(&info->qlock); mutex_unlock(&info->qlock);
pthread_setcanceltype(PTHREAD_CANCEL_ENABLE, NULL);
if (unlikely(idled && !info->idle)) { if (unlikely(idled && !info->idle)) {
info->idle = true; info->idle = true;
@ -915,28 +911,6 @@ static bool avalon_prepare(struct thr_info *thr)
return true; return true;
} }
static void avalon_free_work(struct thr_info *thr)
{
struct cgpu_info *avalon;
struct avalon_info *info;
struct work **works;
int i;
avalon = thr->cgpu;
avalon->queued = 0;
if (unlikely(!avalon->works))
return;
works = avalon->works;
info = avalon->device_data;
for (i = 0; i < info->miner_count * 4; i++) {
if (works[i]) {
work_completed(avalon, works[i]);
works[i] = NULL;
}
}
}
static void do_avalon_close(struct thr_info *thr) static void do_avalon_close(struct thr_info *thr)
{ {
struct cgpu_info *avalon = thr->cgpu; struct cgpu_info *avalon = thr->cgpu;
@ -947,8 +921,6 @@ static void do_avalon_close(struct thr_info *thr)
pthread_cancel(info->write_thr); pthread_cancel(info->write_thr);
pthread_join(info->write_thr, NULL); pthread_join(info->write_thr, NULL);
__avalon_running_reset(avalon, info); __avalon_running_reset(avalon, info);
avalon_idle(avalon, info);
avalon_free_work(thr);
info->no_matching_work = 0; info->no_matching_work = 0;
} }

Loading…
Cancel
Save