summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rts/sm/Scav.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/rts/sm/Scav.c b/rts/sm/Scav.c
index 1640eddabf..9361fb7b71 100644
--- a/rts/sm/Scav.c
+++ b/rts/sm/Scav.c
@@ -134,8 +134,17 @@ scavenge_fun_srt(const StgInfoTable *info)
static void
scavengeTSO (StgTSO *tso)
{
- rtsBool saved_eager = gct->eager_promotion;
+ rtsBool saved_eager;
+
+ if (tso->what_next == ThreadRelocated) {
+ // the only way this can happen is if the old TSO was on the
+ // mutable list. We might have other links to this defunct
+ // TSO, so we must update its link field.
+ evacuate((StgClosure**)&tso->_link);
+ return;
+ }
+ saved_eager = gct->eager_promotion;
gct->eager_promotion = rtsFalse;
if ( tso->why_blocked == BlockedOnMVar