Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/e0b98b42847dea19aff24df2faa354c9d414fc87

>---------------------------------------------------------------

commit e0b98b42847dea19aff24df2faa354c9d414fc87
Author: Duncan Coutts <[email protected]>
Date:   Wed Jun 1 17:16:29 2011 +0100

    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.

>---------------------------------------------------------------

 rts/Sparks.c |    8 +-------
 rts/Sparks.h |    7 +++++++
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/rts/Sparks.c b/rts/Sparks.c
index a826190..18d9597 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 cffe99d..d714cb5 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"



_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to