-#if defined(PARALLEL_HASKELL) || defined(THREADED_RTS)
-StgClosure * findSpark (Capability *cap);
-void initSparkPools (void);
-void freeSparkPool (StgSparkPool *pool);
-void createSparkThread (Capability *cap, StgClosure *p);
-void markSparkQueue (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);
-
-INLINE_HEADER void discardSparksCap (Capability *cap);
-INLINE_HEADER nat sparkPoolSizeCap (Capability *cap);
-INLINE_HEADER rtsBool emptySparkPoolCap (Capability *cap);
-#endif
-
-#if defined(PARALLEL_HASKELL)
-StgTSO *activateSpark (rtsSpark spark) ;
-rtsBool add_to_spark_queue( StgClosure *closure, StgSparkPool *pool );
-void markSparkQueue( void );
-nat spark_queue_len( StgSparkPool *pool );
-void disposeSpark( StgClosure *spark );
-#endif
-
-#if defined(GRAN)
-void findLocalSpark (rtsEvent *event, rtsBool *found_res, rtsSparkQ *spark_res);
-rtsBool activateSpark (rtsEvent *event, rtsSparkQ spark);
-rtsSpark *newSpark(StgClosure *node, nat name, nat gran_info,
- nat size_info, nat par_info, nat local);
-void add_to_spark_queue(rtsSpark *spark);
-rtsSpark *delete_from_sparkq (rtsSpark *spark, PEs p, rtsBool dispose_too);
-void disposeSpark(rtsSpark *spark);
-void disposeSparkQ(rtsSparkQ spark);
-void print_spark(rtsSpark *spark);
-void print_sparkq(PEs proc);
-void print_sparkq_stats(void);
-nat spark_queue_len(PEs proc);
-void markSparkQueue(void);
-#endif
+#include "WSDeque.h"
+
+#include "BeginPrivate.h"
+
+/* typedef for SparkPool in RtsTypes.h */
+
+#if defined(THREADED_RTS)
+
+typedef WSDeque SparkPool;
+
+// 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);