/* -----------------------------------------------------------------------------
*
- * (c) The GHC Team, 2000-2006
+ * (c) The GHC Team, 2000-2009
*
* Sparking support for GRAN, PAR and THREADED_RTS versions of the RTS.
*
#ifndef SPARKS_H
#define SPARKS_H
+#include "WSDeque.h"
+
+#if defined(PARALLEL_HASKELL)
+#error Sparks.c using new internal structure, needs major overhaul!
+#endif
+
+/* 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 (evac_fn evac, void *user, 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
+#endif // THREADED_RTS
#endif /* SPARKS_H */