projects
/
ghc-hetmet.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
02038ff
)
in scavenge_block(), keep going if we're scanning the todo block
author
simonmar@microsoft.com
<unknown>
Tue, 27 Nov 2007 16:07:47 +0000
(16:07 +0000)
committer
simonmar@microsoft.com
<unknown>
Tue, 27 Nov 2007 16:07:47 +0000
(16:07 +0000)
rts/sm/Scav.c-inc
patch
|
blob
|
history
diff --git
a/rts/sm/Scav.c-inc
b/rts/sm/Scav.c-inc
index
7b3a65f
..
2206dd3
100644
(file)
--- 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;
StgInfoTable *info;
step *saved_evac_step;
rtsBool saved_eager_promotion;
+ step_workspace *ws;
p = scan;
p = scan;
@@
-54,10
+55,12
@@
scavenge_block (bdescr *bd, StgPtr scan)
saved_eager_promotion = gct->eager_promotion;
gct->failed_to_evac = rtsFalse;
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.
// 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);
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_)));
}
debugTrace(DEBUG_gc, " scavenged %ld bytes",
(unsigned long)((bd->free - scan) * sizeof(W_)));
}