diff options
-rw-r--r-- | rts/sm/MarkWeak.c | 8 |
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; } |