RTS tidyup sweep, first phase
[ghc-hetmet.git] / rts / sm / GCAux.c
index 0fb61f1..404e9bb 100644 (file)
@@ -7,10 +7,11 @@
  *
  * ---------------------------------------------------------------------------*/
 
+#include "PosixSource.h"
 #include "Rts.h"
-#include "Storage.h"
-#include "MBlock.h"
+
 #include "GC.h"
+#include "Storage.h"
 #include "Compact.h"
 #include "Task.h"
 #include "Capability.h"
@@ -41,7 +42,6 @@ isAlive(StgClosure *p)
     q = UNTAG_CLOSURE(p);
 
     ASSERT(LOOKS_LIKE_CLOSURE_PTR(q));
-    info = get_itbl(q);
 
     // ignore static closures 
     //
@@ -49,7 +49,7 @@ isAlive(StgClosure *p)
     // Problem here is that we sometimes don't set the link field, eg.
     // for static closures with an empty SRT or CONSTR_STATIC_NOCAFs.
     //
-    if (!HEAP_ALLOCED(q)) {
+    if (!HEAP_ALLOCED_GC(q)) {
        return p;
     }
 
@@ -63,14 +63,28 @@ isAlive(StgClosure *p)
 
     // large objects use the evacuated flag
     if (bd->flags & BF_LARGE) {
+        if (get_itbl(q)->type == TSO &&
+            ((StgTSO *)p)->what_next == ThreadRelocated) {
+            p = (StgClosure *)((StgTSO *)p)->_link;
+            continue;
+        }
        return NULL;
     }
 
     // check the mark bit for compacted steps
-    if ((bd->flags & BF_COMPACTED) && is_marked((P_)q,bd)) {
+    if ((bd->flags & BF_MARKED) && is_marked((P_)q,bd)) {
        return p;
     }
 
+    info = q->header.info;
+
+    if (IS_FORWARDING_PTR(info)) {
+        // alive! 
+        return (StgClosure*)UN_FORWARDING_PTR(info);
+    }
+
+    info = INFO_PTR_TO_STRUCT(info);
+
     switch (info->type) {
 
     case IND:
@@ -82,10 +96,6 @@ isAlive(StgClosure *p)
       p = ((StgInd *)q)->indirectee;
       continue;
 
-    case EVACUATED:
-      // alive! 
-      return ((StgEvacuated *)q)->evacuee;
-
     case TSO:
       if (((StgTSO *)q)->what_next == ThreadRelocated) {
        p = (StgClosure *)((StgTSO *)q)->_link;