fix haddock submodule pointer
[ghc-hetmet.git] / rts / Sparks.h
index f617558..cffe99d 100644 (file)
@@ -1,6 +1,6 @@
 /* -----------------------------------------------------------------------------
  *
- * (c) The GHC Team, 2000-2006
+ * (c) The GHC Team, 2000-2009
  *
  * Sparking support for GRAN, PAR and THREADED_RTS versions of the RTS.
  * 
@@ -9,70 +9,62 @@
 #ifndef SPARKS_H
 #define SPARKS_H
 
+#include "WSDeque.h"
+
+#include "BeginPrivate.h"
+
+/* typedef for SparkPool in RtsTypes.h */
+
 #if defined(THREADED_RTS)
-StgClosure * findSpark         (Capability *cap);
-void         initSparkPools    (void);
-void         freeSparkPool     (StgSparkPool *pool);
-void         createSparkThread (Capability *cap, StgClosure *p);
-void         updateSparkQueue  (Capability *cap);
-void         traverseSparkQueue(evac_fn evac, void *user, Capability *cap);
 
-INLINE_HEADER void     discardSparks  (StgSparkPool *pool);
-INLINE_HEADER nat      sparkPoolSize  (StgSparkPool *pool);
-INLINE_HEADER rtsBool  emptySparkPool (StgSparkPool *pool);
+typedef WSDeque SparkPool;
 
-INLINE_HEADER void     discardSparksCap  (Capability *cap);
-INLINE_HEADER nat      sparkPoolSizeCap  (Capability *cap);
-INLINE_HEADER rtsBool  emptySparkPoolCap (Capability *cap);
-#endif
+// Initialisation
+void initSparkPools (void);
+
+// Take a spark from the "write" end of the pool.  Can be called
+// by the pool owner only.
+INLINE_HEADER StgClosure* reclaimSpark(SparkPool *pool);
+
+// Returns True if the spark pool is empty (can give a false positive
+// if the pool is almost empty).
+INLINE_HEADER rtsBool looksEmpty(SparkPool* deque);
+
+StgClosure * tryStealSpark     (Capability *cap);
+void         freeSparkPool     (SparkPool *pool);
+void         createSparkThread (Capability *cap);
+void         traverseSparkQueue(evac_fn evac, void *user, Capability *cap);
+void         pruneSparkQueue   (Capability *cap);
+
+INLINE_HEADER void discardSparks  (SparkPool *pool);
+INLINE_HEADER long sparkPoolSize  (SparkPool *pool);
 
 /* -----------------------------------------------------------------------------
  * PRIVATE below here
  * -------------------------------------------------------------------------- */
 
-#if defined(PARALLEL_HASKELL) || defined(THREADED_RTS)
-
-INLINE_HEADER rtsBool
-emptySparkPool (StgSparkPool *pool)
+INLINE_HEADER StgClosure* reclaimSpark(SparkPool *pool)
 {
-    return (pool->hd == pool->tl);
+    return popWSDeque(pool);
 }
 
-INLINE_HEADER rtsBool
-emptySparkPoolCap (Capability *cap) 
-{ return emptySparkPool(&cap->r.rSparks); }
-
-INLINE_HEADER nat
-sparkPoolSize (StgSparkPool *pool) 
+INLINE_HEADER rtsBool looksEmpty(SparkPool* deque)
 {
-    if (pool->hd <= pool->tl) {
-       return (pool->hd - pool->tl);
-    } else {
-       return (pool->lim - pool->hd + pool->tl - pool->base);
-    }
+    return looksEmptyWSDeque(deque);
 }
 
-INLINE_HEADER nat
-sparkPoolSizeCap (Capability *cap) 
-{ return sparkPoolSize(&cap->r.rSparks); }
+INLINE_HEADER long sparkPoolSize (SparkPool *pool) 
+{ 
+    return dequeElements(pool);
+}
 
-INLINE_HEADER void
-discardSparks (StgSparkPool *pool)
+INLINE_HEADER void discardSparks (SparkPool *pool)
 {
-    pool->hd = pool->tl;
+    discardElements(pool);
 }
 
-INLINE_HEADER void
-discardSparksCap (Capability *cap) 
-{ return discardSparks(&cap->r.rSparks); }
-
-
-#elif defined(THREADED_RTS) 
-
-INLINE_HEADER rtsBool
-emptySparkPoolCap (Capability *cap STG_UNUSED)
-{ return rtsTrue; }
+#endif // THREADED_RTS
 
-#endif
+#include "EndPrivate.h"
 
 #endif /* SPARKS_H */