pruneSparkQueue: handle CAFs
authorSimon Marlow <marlowsd@gmail.com>
Fri, 18 Mar 2011 14:21:22 +0000 (14:21 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Fri, 18 Mar 2011 14:21:22 +0000 (14:21 +0000)
rts/Sparks.c

index ad08f3b..a826190 100644 (file)
@@ -219,19 +219,34 @@ pruneSparkQueue (Capability *cap)
                   pruned_sparks++; // discard spark
                   cap->sparks_fizzled++;
               }
-          } else if (HEAP_ALLOCED(spark) &&
-                     (Bdescr((P_)spark)->flags & BF_EVACUATED)) {
-              if (closure_SHOULD_SPARK(spark)) {
-                  elements[botInd] = spark; // keep entry (new address)
-                  botInd++;
-                  n++;
+          } else if (HEAP_ALLOCED(spark)) {
+              if ((Bdescr((P_)spark)->flags & BF_EVACUATED)) {
+                  if (closure_SHOULD_SPARK(spark)) {
+                      elements[botInd] = spark; // keep entry (new address)
+                      botInd++;
+                      n++;
+                  } else {
+                      pruned_sparks++; // discard spark
+                      cap->sparks_fizzled++;
+                  }
               } else {
                   pruned_sparks++; // discard spark
-                  cap->sparks_fizzled++;
+                  cap->sparks_gcd++;
               }
           } else {
-              pruned_sparks++; // discard spark
-              cap->sparks_gcd++;
+              if (INFO_PTR_TO_STRUCT(info)->type == THUNK_STATIC) {
+                  if (*THUNK_STATIC_LINK(spark) != NULL) {
+                      elements[botInd] = spark; // keep entry (new address)
+                      botInd++;
+                      n++;
+                  } else {
+                      pruned_sparks++; // discard spark
+                      cap->sparks_gcd++;
+                  }
+              } else {
+                  pruned_sparks++; // discard spark
+                  cap->sparks_fizzled++;
+              }
           }
       }