From: simonmar@microsoft.com Date: Tue, 27 Nov 2007 16:07:47 +0000 (+0000) Subject: in scavenge_block(), keep going if we're scanning the todo block X-Git-Tag: Before_cabalised-GHC~278 X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=0488ced8e92c06d6404159c00599c44db6b51dc8 in scavenge_block(), keep going if we're scanning the todo block --- diff --git a/rts/sm/Scav.c-inc b/rts/sm/Scav.c-inc index 7b3a65f..2206dd3 100644 --- a/rts/sm/Scav.c-inc +++ b/rts/sm/Scav.c-inc @@ -43,6 +43,7 @@ scavenge_block (bdescr *bd, StgPtr scan) StgInfoTable *info; step *saved_evac_step; rtsBool saved_eager_promotion; + step_workspace *ws; p = scan; @@ -54,10 +55,12 @@ scavenge_block (bdescr *bd, StgPtr scan) saved_eager_promotion = gct->eager_promotion; gct->failed_to_evac = rtsFalse; + ws = &gct->steps[bd->step->abs_no]; + // 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. - while (p < bd->free) { + while (p < bd->free || (bd == ws->todo_bd && p < ws->todo_free)) { ASSERT(LOOKS_LIKE_CLOSURE_PTR(p)); info = get_itbl((StgClosure *)p); @@ -462,6 +465,10 @@ scavenge_block (bdescr *bd, StgPtr scan) } } + if (p > bd->free) { + bd->free = p; + } + debugTrace(DEBUG_gc, " scavenged %ld bytes", (unsigned long)((bd->free - scan) * sizeof(W_))); }