Commit 0488ced8 authored by simonmar@microsoft.com's avatar simonmar@microsoft.com
Browse files

in scavenge_block(), keep going if we're scanning the todo block

parent 02038ff3
......@@ -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_)));
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment