[project @ 2003-08-14 15:36:13 by simonmar]
[ghc-hetmet.git] / ghc / rts / GC.c
index 3ab057a..cbb939e 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: GC.c,v 1.155 2003/05/14 09:13:59 simonmar Exp $
+ * $Id: GC.c,v 1.158 2003/08/14 15:36:13 simonmar Exp $
  *
  * (c) The GHC Team 1998-2003
  *
@@ -378,6 +378,7 @@ GarbageCollect ( void (*get_roots)(evac_fn), rtsBool force_major_gc )
   if (RtsFlags.GcFlags.generations == 1) {
     old_to_blocks = g0s0->to_blocks;
     g0s0->to_blocks = NULL;
+    g0s0->n_to_blocks = 0;
   }
 
   /* Keep a count of how many new blocks we allocated during this GC
@@ -1930,8 +1931,18 @@ loop:
        * list it contains.  
        */
       {
-         StgTSO *new_tso = (StgTSO *)copy((StgClosure *)tso,tso_sizeW(tso),stp);
+         StgTSO *new_tso;
+         StgPtr p, q;
+
+         new_tso = (StgTSO *)copyPart((StgClosure *)tso,
+                                      tso_sizeW(tso),
+                                      sizeofW(StgTSO), stp);
          move_TSO(tso, new_tso);
+         for (p = tso->sp, q = new_tso->sp;
+              p < tso->stack+tso->stack_size;) {
+             *q++ = *p++;
+         }
+         
          return (StgClosure *)new_tso;
       }
     }
@@ -2165,7 +2176,7 @@ move_TSO (StgTSO *src, StgTSO *dest)
 {
     ptrdiff_t diff;
 
-    // relocate the stack pointers... 
+    // relocate the stack pointer... 
     diff = (StgPtr)dest - (StgPtr)src; // In *words* 
     dest->sp = (StgPtr)dest->sp + diff;
 }
@@ -2183,7 +2194,7 @@ scavenge_large_srt_bitmap( StgLargeSRT *large_srt )
     b = 0;
     bitmap = large_srt->l.bitmap[b];
     size   = (nat)large_srt->l.size;
-    p      = large_srt->srt;
+    p      = (StgClosure **)large_srt->srt;
     for (i = 0; i < size; ) {
        if ((bitmap & 1) != 0) {
            evacuate(*p);