fix #3910
[ghc-hetmet.git] / rts / Sparks.c
index e5e6d7e..7e2556d 100644 (file)
@@ -45,7 +45,7 @@ createSparkThread (Capability *cap)
     StgTSO *tso;
 
     tso = createIOThread (cap, RtsFlags.GcFlags.initialStkSize, 
-                          &base_GHCziConc_runSparks_closure);
+                          (StgClosure *)runSparks_closure);
 
     traceEventCreateSparkThread(cap, tso->id);
 
@@ -112,7 +112,7 @@ tryStealSpark (Capability *cap)
  * -------------------------------------------------------------------------- */
 
 void
-pruneSparkQueue (evac_fn evac, void *user, Capability *cap)
+pruneSparkQueue (Capability *cap)
 { 
     SparkPool *pool;
     StgClosurePtr spark, tmp, *elements;
@@ -208,17 +208,21 @@ pruneSparkQueue (evac_fn evac, void *user, Capability *cap)
               pruned_sparks++; // discard spark
               cap->sparks_pruned++;
           }
-      } else {
-          if (!(closure_flags[INFO_PTR_TO_STRUCT(info)->type] & _NS)) {
+      } else if (HEAP_ALLOCED(spark) && 
+                 (Bdescr((P_)spark)->flags & BF_EVACUATED)) {
+          if (closure_SHOULD_SPARK(spark)) {
               elements[botInd] = spark; // keep entry (new address)
-              evac (user, &elements[botInd]);
               botInd++;
               n++;
           } else {
               pruned_sparks++; // discard spark
               cap->sparks_pruned++;
           }
+      } else {
+          pruned_sparks++; // discard spark
+          cap->sparks_pruned++;
       }
+
       currInd++;
 
       // in the loop, we may reach the bounds, and instantly wrap around