X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FSparks.h;h=77d280bea8e1a855f190f804b867029a9c6d6886;hb=0dbbf1932d550293986af6244202cb735b2cd966;hp=37ca92ca3eb006b49fc34fb378f27a842e3ad8fc;hpb=dd4c28a9c706cce09ecc2c6f532969efa925532f;p=ghc-hetmet.git diff --git a/ghc/rts/Sparks.h b/ghc/rts/Sparks.h index 37ca92c..77d280b 100644 --- a/ghc/rts/Sparks.h +++ b/ghc/rts/Sparks.h @@ -1,14 +1,42 @@ /* ----------------------------------------------------------------------------- - * $Id: Sparks.h,v 1.2 2000/03/31 03:09:36 hwloidl Exp $ * - * (c) The GHC Team, 2000 + * (c) The GHC Team, 2000-2006 * - * Sparking support for GRAN, PAR and SMP versions of the RTS. + * Sparking support for GRAN, PAR and THREADED_RTS versions of the RTS. * * ---------------------------------------------------------------------------*/ -#if defined(GRAN) +#ifndef SPARKS_H +#define SPARKS_H + +#if !defined(GRAN) +StgInt newSpark (StgRegTable *reg, StgClosure *p); +#endif + +#if defined(PARALLEL_HASKELL) || defined(THREADED_RTS) +StgClosure * findSpark (Capability *cap); +void initSparkPools (void); +void markSparkQueue (evac_fn evac); +void createSparkThread (Capability *cap, StgClosure *p); + +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, @@ -22,13 +50,55 @@ void print_sparkq(PEs proc); void print_sparkq_stats(void); nat spark_queue_len(PEs proc); void markSparkQueue(void); +#endif -#elif defined(PAR) || defined(SMP) +/* ----------------------------------------------------------------------------- + * PRIVATE below here + * -------------------------------------------------------------------------- */ -void initSparkPools( void ); -void markSparkQueue( void ); -StgClosure *findSpark( void ); -rtsBool add_to_spark_queue( StgClosure *closure, StgSparkPool *pool ); -void markSparkQueue( void ); +#if defined(PARALLEL_HASKELL) || defined(THREADED_RTS) + +INLINE_HEADER rtsBool +emptySparkPool (StgSparkPool *pool) +{ + return (pool->hd == pool->tl); +} + +INLINE_HEADER rtsBool +emptySparkPoolCap (Capability *cap) +{ return emptySparkPool(&cap->r.rSparks); } + +INLINE_HEADER nat +sparkPoolSize (StgSparkPool *pool) +{ + if (pool->hd <= pool->tl) { + return (pool->hd - pool->tl); + } else { + return (pool->lim - pool->hd + pool->tl - pool->base); + } +} + +INLINE_HEADER nat +sparkPoolSizeCap (Capability *cap) +{ return sparkPoolSize(&cap->r.rSparks); } + +INLINE_HEADER void +discardSparks (StgSparkPool *pool) +{ + pool->hd = pool->tl; +} + +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 /* SPARKS_H */