From 0488ced8e92c06d6404159c00599c44db6b51dc8 Mon Sep 17 00:00:00 2001 From: "simonmar@microsoft.com" Date: Tue, 27 Nov 2007 16:07:47 +0000 Subject: [PATCH] in scavenge_block(), keep going if we're scanning the todo block --- rts/sm/Scav.c-inc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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_))); } -- 1.7.10.4