diff --git a/ghc/rts/GC.c b/ghc/rts/GC.c index ca0fbd137f18b517eb3763b4fb1ffc29fd868d01..f3ce4c63741bbcf3f1a49866621ec779aeeb2936 100644 --- a/ghc/rts/GC.c +++ b/ghc/rts/GC.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: GC.c,v 1.67 1999/11/18 16:02:21 sewardj Exp $ + * $Id: GC.c,v 1.68 1999/12/01 15:07:00 simonmar Exp $ * * (c) The GHC Team 1998-1999 * @@ -1514,6 +1514,28 @@ scavenge_srt(const StgInfoTable *info) } } +/* ----------------------------------------------------------------------------- + Scavenge a TSO. + -------------------------------------------------------------------------- */ + +static void +scavengeTSO (StgTSO *tso) +{ + /* chase the link field for any TSOs on the same queue */ + (StgClosure *)tso->link = evacuate((StgClosure *)tso->link); + if ( tso->why_blocked == BlockedOnMVar + || tso->why_blocked == BlockedOnBlackHole + || tso->why_blocked == BlockedOnException) { + tso->block_info.closure = evacuate(tso->block_info.closure); + } + if ( tso->blocked_exceptions != NULL ) { + tso->blocked_exceptions = + (StgTSO *)evacuate((StgClosure *)tso->blocked_exceptions); + } + /* scavenge this thread's stack */ + scavenge_stack(tso->sp, &(tso->stack[tso->stack_size])); +} + /* ----------------------------------------------------------------------------- Scavenge a given step until there are no more objects in this step to scavenge. @@ -1819,18 +1841,9 @@ scavenge(step *step) case TSO: { - StgTSO *tso; - - tso = (StgTSO *)p; + StgTSO *tso = (StgTSO *)p; evac_gen = 0; - /* chase the link field for any TSOs on the same queue */ - (StgClosure *)tso->link = evacuate((StgClosure *)tso->link); - if ( tso->why_blocked == BlockedOnMVar - || tso->why_blocked == BlockedOnBlackHole) { - tso->block_info.closure = evacuate(tso->block_info.closure); - } - /* scavenge this thread's stack */ - scavenge_stack(tso->sp, &(tso->stack[tso->stack_size])); + scavengeTSO(tso); evac_gen = saved_evac_gen; p += tso_sizeW(tso); break; @@ -2178,12 +2191,7 @@ scavenge_mutable_list(generation *gen) { StgTSO *tso = (StgTSO *)p; - (StgClosure *)tso->link = evacuate((StgClosure *)tso->link); - if ( tso->why_blocked == BlockedOnMVar - || tso->why_blocked == BlockedOnBlackHole) { - tso->block_info.closure = evacuate(tso->block_info.closure); - } - scavenge_stack(tso->sp, &(tso->stack[tso->stack_size])); + scavengeTSO(tso); /* Don't take this TSO off the mutable list - it might still * point to some younger objects (because we set evac_gen to 0 @@ -2571,20 +2579,8 @@ scavenge_large(step *step) } case TSO: - { - StgTSO *tso; - - tso = (StgTSO *)p; - /* chase the link field for any TSOs on the same queue */ - (StgClosure *)tso->link = evacuate((StgClosure *)tso->link); - if ( tso->why_blocked == BlockedOnMVar - || tso->why_blocked == BlockedOnBlackHole) { - tso->block_info.closure = evacuate(tso->block_info.closure); - } - /* scavenge this thread's stack */ - scavenge_stack(tso->sp, &(tso->stack[tso->stack_size])); + scavengeTSO((StgTSO *)p); continue; - } default: barf("scavenge_large: unknown/strange object");