X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=rts%2Fsm%2FScav.c;h=9361fb7b71c120867aa538c0eb08403247648820;hp=1640eddabf2af776e7af471f4b99c154835c5028;hb=75927bb04bccb3ada850641939f0842a4168968a;hpb=65bb9b5ae78ee29100ea6bf5617b0fdbc0a100bd diff --git a/rts/sm/Scav.c b/rts/sm/Scav.c index 1640edd..9361fb7 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