diff options
author | Simon Marlow <marlowsd@gmail.com> | 2009-12-04 11:10:37 +0000 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2009-12-04 11:10:37 +0000 |
commit | da01c3149a07d0e1dc021dfc037eb10853024ee3 (patch) | |
tree | 6dfad29e2d4f925c5b06b617453ab5e96d659916 /rts/sm/Evac.c | |
parent | a0ca27ac659bcbe0c291b3bd1a12a965f43f5f55 (diff) | |
download | haskell-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.c | 5 |
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; |