summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rts/Sparks.c8
-rw-r--r--rts/Sparks.h7
2 files changed, 8 insertions, 7 deletions
diff --git a/rts/Sparks.c b/rts/Sparks.c
index a826190941..18d9597ec2 100644
--- a/rts/Sparks.c
+++ b/rts/Sparks.c
@@ -63,13 +63,7 @@ newSpark (StgRegTable *reg, StgClosure *p)
Capability *cap = regTableToCapability(reg);
SparkPool *pool = cap->sparks;
- /* I am not sure whether this is the right thing to do.
- * Maybe it is better to exploit the tag information
- * instead of throwing it away?
- */
- p = UNTAG_CLOSURE(p);
-
- if (closure_SHOULD_SPARK(p)) {
+ if (!fizzledSpark(p)) {
pushWSDeque(pool,p);
cap->sparks_created++;
} else {
diff --git a/rts/Sparks.h b/rts/Sparks.h
index cffe99dd39..d714cb5d09 100644
--- a/rts/Sparks.h
+++ b/rts/Sparks.h
@@ -31,6 +31,8 @@ INLINE_HEADER StgClosure* reclaimSpark(SparkPool *pool);
INLINE_HEADER rtsBool looksEmpty(SparkPool* deque);
StgClosure * tryStealSpark (Capability *cap);
+INLINE_HEADER rtsBool fizzledSpark (StgClosure *);
+
void freeSparkPool (SparkPool *pool);
void createSparkThread (Capability *cap);
void traverseSparkQueue(evac_fn evac, void *user, Capability *cap);
@@ -63,6 +65,11 @@ INLINE_HEADER void discardSparks (SparkPool *pool)
discardElements(pool);
}
+INLINE_HEADER rtsBool fizzledSpark (StgClosure *spark)
+{
+ return (GET_CLOSURE_TAG(spark) != 0 || !closure_SHOULD_SPARK(spark));
+}
+
#endif // THREADED_RTS
#include "EndPrivate.h"