Use message-passing to implement throwTo in the RTS
[ghc-hetmet.git] / rts / sm / Evac.c
index 93d5d58..21017a6 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;
@@ -625,7 +626,8 @@ loop:
       return;
 
   case WEAK:
-  case STABLE_NAME:
+  case PRIM:
+  case MUT_PRIM:
       copy_tag(p,info,q,sizeW_fromITBL(INFO_PTR_TO_STRUCT(info)),gen,tag);
       return;
 
@@ -720,30 +722,10 @@ loop:
       }
     }
 
-  case TREC_HEADER: 
-      copy(p,info,q,sizeofW(StgTRecHeader),gen);
-      return;
-
-  case TVAR_WATCH_QUEUE:
-      copy(p,info,q,sizeofW(StgTVarWatchQueue),gen);
-      return;
-
-  case TVAR:
-      copy(p,info,q,sizeofW(StgTVar),gen);
-      return;
-    
   case TREC_CHUNK:
       copy(p,info,q,sizeofW(StgTRecChunk),gen);
       return;
 
-  case ATOMIC_INVARIANT:
-      copy(p,info,q,sizeofW(StgAtomicInvariant),gen);
-      return;
-
-  case INVARIANT_CHECK_QUEUE:
-      copy(p,info,q,sizeofW(StgInvariantCheckQueue),gen);
-      return;
-
   default:
     barf("evacuate: strange closure type %d", (int)(INFO_PTR_TO_STRUCT(info)->type));
   }
@@ -877,7 +859,7 @@ selector_chain:
         } while (info_ptr == (W_)&stg_WHITEHOLE_info);
 
         // make sure someone else didn't get here first...
-        if (IS_FORWARDING_PTR(p) || 
+        if (IS_FORWARDING_PTR(info_ptr) || 
             INFO_PTR_TO_STRUCT(info_ptr)->type != THUNK_SELECTOR) {
             // v. tricky now.  The THUNK_SELECTOR has been evacuated
             // by another thread, and is now either a forwarding ptr or IND.