summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rts/sm/MarkWeak.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/rts/sm/MarkWeak.c b/rts/sm/MarkWeak.c
index 7475b5e625..65b1338f10 100644
--- a/rts/sm/MarkWeak.c
+++ b/rts/sm/MarkWeak.c
@@ -213,6 +213,12 @@ static bool resurrectUnreachableThreads (generation *gen, StgTSO **resurrected_t
switch (t->what_next) {
case ThreadKilled:
case ThreadComplete:
+ // The thread was unreachable so far, but it might still end up
+ // being reachable later, e.g. after collectDeadWeakPtrs(). We don't
+ // want the global_link field to be dangling in that case, so reset
+ // it to END_TSO_QUEUE. The copying GC doesn't currently care, but
+ // the compacting GC does, see #17785.
+ t->global_link = END_TSO_QUEUE;
continue;
default:
tmp = t;
@@ -222,6 +228,8 @@ static bool resurrectUnreachableThreads (generation *gen, StgTSO **resurrected_t
flag = true;
}
}
+
+ gen->old_threads = END_TSO_QUEUE;
return flag;
}