evaluate_large: evaluate large objects to bd->dest rather than gen->to
authorSimon Marlow <marlowsd@gmail.com>
Fri, 4 Dec 2009 11:10:37 +0000 (11:10 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Fri, 4 Dec 2009 11:10:37 +0000 (11:10 +0000)
This fixes aging of large objects in the new scheme.  Bug found by
perf/space_leaks/space_leak_001.  Yay perf regressions tests.

rts/sm/Evac.c

index 93d5d58..db24909 100644 (file)
@@ -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;