X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FScav.c-inc;h=a75f6ee04efff2975ca74ef40daf2c0f3da41430;hb=2ac31c7f6e9306024da822674f478db039edb39b;hp=64677c0a5a89cfd773536e0d0ac910b34cf84052;hpb=a75a8790410ce3ffb439bfd0b7c3999e7df72eb1;p=ghc-hetmet.git diff --git a/rts/sm/Scav.c-inc b/rts/sm/Scav.c-inc index 64677c0..a75f6ee 100644 --- a/rts/sm/Scav.c-inc +++ b/rts/sm/Scav.c-inc @@ -1,6 +1,6 @@ /* -----------------------------------------------------------------------*-c-*- * - * (c) The GHC Team 1998-2006 + * (c) The GHC Team 1998-2008 * * Generational garbage collector: scavenging functions * @@ -14,16 +14,20 @@ // This file is #included into Scav.c, twice: firstly with PARALLEL_GC // defined, the second time without. -#ifndef PARALLEL_GC -#define scavenge_block(a) scavenge_block1(a) -#define evacuate(a) evacuate1(a) -#define recordMutableGen_GC(a,b) recordMutableGen(a,b) +#if defined(THREADED_RTS) && !defined(PARALLEL_GC) +# define scavenge_block(a) scavenge_block1(a) +# define evacuate(a) evacuate1(a) +# define recordMutableGen_GC(a,b) recordMutableGen(a,b) #else -#undef scavenge_block -#undef evacuate -#undef recordMutableGen_GC +# undef scavenge_block +# undef evacuate +# undef recordMutableGen_GC +# if !defined(THREADED_RTS) +# define scavenge_block1(a) scavenge_block(a) +# endif #endif + static void scavenge_block (bdescr *bd); /* ----------------------------------------------------------------------------- @@ -47,11 +51,10 @@ scavenge_block (bdescr *bd) rtsBool saved_eager_promotion; step_workspace *ws; - p = bd->u.scan; - debugTrace(DEBUG_gc, "scavenging block %p (gen %d, step %d) @ %p", - bd->start, bd->gen_no, bd->step->no, p); + bd->start, bd->gen_no, bd->step->no, bd->u.scan); + gct->scan_bd = bd; gct->evac_step = bd->step; saved_evac_step = gct->evac_step; saved_eager_promotion = gct->eager_promotion; @@ -59,6 +62,8 @@ scavenge_block (bdescr *bd) ws = &gct->steps[bd->step->abs_no]; + p = bd->u.scan; + // we might be evacuating into the very object that we're // scavenging, so we have to check the real bd->free pointer each // time around the loop. @@ -326,18 +331,7 @@ scavenge_block (bdescr *bd) case TSO: { StgTSO *tso = (StgTSO *)p; - - gct->eager_promotion = rtsFalse; - scavengeTSO(tso); - gct->eager_promotion = saved_eager_promotion; - - if (gct->failed_to_evac) { - tso->flags |= TSO_DIRTY; - } else { - tso->flags &= ~TSO_DIRTY; - } - - gct->failed_to_evac = rtsTrue; // always on the mutable list + scavengeTSO(tso); p += tso_sizeW(tso); break; } @@ -454,6 +448,14 @@ scavenge_block (bdescr *bd) // update stats: this is a block that has been scavenged gct->scanned += bd->free - bd->u.scan; bd->u.scan = bd->free; + + if (bd != ws->todo_bd) { + // we're not going to evac any more objects into + // this block, so push it now. + push_scanned_block(bd, ws); + } + + gct->scan_bd = NULL; } #undef scavenge_block