Commit e0b98b42 authored by Duncan Coutts's avatar Duncan Coutts
Browse files

Improve the newSpark dud test by using the pointer tag bits

newSpark() checks if the spark is a dud, and if so does not add it to
the spark pool. Previously, newSpark would discard the pointer tag bits
and just check closure_SHOULD_SPARK(p). We can take advantage of the
tag bits which can tell us if the pointer points to a value. If it is,
it's a dud spark and we don't need to add it to the spark pool.
parent 81eddb4c
......@@ -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?
if (closure_SHOULD_SPARK(p)) {
if (!fizzledSpark(p)) {
} else {
......@@ -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)
INLINE_HEADER rtsBool fizzledSpark (StgClosure *spark)
return (GET_CLOSURE_TAG(spark) != 0 || !closure_SHOULD_SPARK(spark));
#endif // THREADED_RTS
#include "EndPrivate.h"
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment