From 06721957a0c5aa32872464da34c06361aeebd92a Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Sat, 18 Feb 2012 16:34:06 +1100 Subject: [PATCH] Freeze the queues on all threads that are sent the pause message to prevent them trying to start up again with saved pings in their queues. --- cgminer.c | 1 + miner.h | 1 + util.c | 24 +++++++++++++++++++++--- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/cgminer.c b/cgminer.c index b1aaebcc..0c455f1a 100644 --- a/cgminer.c +++ b/cgminer.c @@ -1702,6 +1702,7 @@ void kill_work(void) /* Stop the mining threads*/ for (i = 0; i < mining_threads; i++) { thr = &thr_info[i]; + thr_info_freeze(thr); thr->pause = true; } diff --git a/miner.h b/miner.h index 68ce55b3..7550ec7f 100644 --- a/miner.h +++ b/miner.h @@ -280,6 +280,7 @@ struct thr_info { extern int thr_info_create(struct thr_info *thr, pthread_attr_t *attr, void *(*start) (void *), void *arg); extern void thr_info_cancel(struct thr_info *thr); +extern void thr_info_freeze(struct thr_info *thr); struct string_elist { diff --git a/util.c b/util.c index 1d037bf2..9ff5a244 100644 --- a/util.c +++ b/util.c @@ -668,13 +668,31 @@ int thr_info_create(struct thr_info *thr, pthread_attr_t *attr, void *(*start) ( return ret; } -void thr_info_cancel(struct thr_info *thr) +void thr_info_freeze(struct thr_info *thr) { + struct tq_ent *ent, *iter; + struct thread_q *tq; + if (!thr) return; - if (thr->q) - tq_freeze(thr->q); + tq = thr->q; + if (!tq) + return; + + mutex_lock(&tq->mutex); + tq->frozen = true; + list_for_each_entry_safe(ent, iter, &tq->q, q_node) { + list_del(&ent->q_node); + free(ent); + } + mutex_unlock(&tq->mutex); +} + +void thr_info_cancel(struct thr_info *thr) +{ + if (!thr) + return; if (PTH(thr) != 0L) { pthread_cancel(thr->pth);