RTS tidyup sweep, first phase
[ghc-hetmet.git] / rts / sm / GCAux.c
index 825d0f9..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"
@@ -48,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;
     }
 
@@ -62,11 +63,16 @@ 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;
     }