@@ -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;
}
@@ -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 {
@@ -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)
if (PTH(thr) != 0L) {
pthread_cancel(thr->pth);