summaryrefslogtreecommitdiff
path: root/rts/sm/Evac.c
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2009-12-04 11:10:37 +0000
committerSimon Marlow <marlowsd@gmail.com>2009-12-04 11:10:37 +0000
commitda01c3149a07d0e1dc021dfc037eb10853024ee3 (patch)
tree6dfad29e2d4f925c5b06b617453ab5e96d659916 /rts/sm/Evac.c
parenta0ca27ac659bcbe0c291b3bd1a12a965f43f5f55 (diff)
downloadhaskell-da01c3149a07d0e1dc021dfc037eb10853024ee3.tar.gz
evaluate_large: evaluate large objects to bd->dest rather than gen->to
This fixes aging of large objects in the new scheme. Bug found by perf/space_leaks/space_leak_001. Yay perf regressions tests.
Diffstat (limited to 'rts/sm/Evac.c')
-rw-r--r--rts/sm/Evac.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/rts/sm/Evac.c b/rts/sm/Evac.c
index 93d5d587d9..db249094e0 100644
--- a/rts/sm/Evac.c
+++ b/rts/sm/Evac.c
@@ -239,10 +239,11 @@ copy(StgClosure **p, const StgInfoTable *info,
STATIC_INLINE void
evacuate_large(StgPtr p)
{
- bdescr *bd = Bdescr(p);
+ bdescr *bd;
generation *gen, *new_gen;
gen_workspace *ws;
+ bd = Bdescr(p);
gen = bd->gen;
ACQUIRE_SPIN_LOCK(&gen->sync_large_objects);
@@ -271,7 +272,7 @@ evacuate_large(StgPtr p)
/* link it on to the evacuated large object list of the destination gen
*/
- new_gen = gen->to;
+ new_gen = bd->dest;
if (new_gen < gct->evac_gen) {
if (gct->eager_promotion) {
new_gen = gct->evac_gen;