Commit 06721957a0c5aa32872464da34c06361aeebd92a

Con Kolivas 2012-02-18T16:34:06

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.

diff --git a/cgminer.c b/cgminer.c
index b1aaebc..0c455f1 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 68ce55b..7550ec7 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 1d037bf..9ff5a24 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);