X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FSparks.h;h=105742f04f9714be20e28031695f473d0fac139b;hb=2c8d42f32022f4950606d75d53e45a4c30d210df;hp=8e0ba90f3d61619e546a9d7619dc484dad3ac118;hpb=ccb958030d8e3afcef8ef905372f9586e5ada2a3;p=ghc-hetmet.git diff --git a/rts/Sparks.h b/rts/Sparks.h index 8e0ba90..105742f 100644 --- a/rts/Sparks.h +++ b/rts/Sparks.h @@ -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" + +#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 pruneSparkQueues (void); -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->tl - pool->hd); - } 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 */