X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FSparks.h;h=dbbf268988a98969b6e19180715494ed23a6c4ff;hb=cf9650f2a1690c04051c716124bb0350adc74ae7;hp=65db52d83095e230ac9fd26a313bd1c92d00dbe4;hpb=5c42da2ef1a50fc0c47d229743f96f9f6c0dace3;p=ghc-hetmet.git diff --git a/rts/Sparks.h b/rts/Sparks.h index 65db52d..dbbf268 100644 --- a/rts/Sparks.h +++ b/rts/Sparks.h @@ -9,91 +9,84 @@ #ifndef SPARKS_H #define SPARKS_H -#if defined(PARALLEL_HASKELL) || defined(THREADED_RTS) +#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) + +/* INVARIANTS, in this order: bottom/top consistent, reasonable size, + topBound consistent, space pointer, space accessible to us */ +#define ASSERT_SPARK_POOL_INVARIANTS(p) \ + ASSERT((p)->bottom >= (p)->top); \ + ASSERT((p)->size > 0); \ + ASSERT((p)->size > (p)->bottom - (p)->top); \ + ASSERT((p)->topBound <= (p)->top); \ + ASSERT((p)->elements != NULL); \ + ASSERT(*((p)->elements) || 1); \ + ASSERT(*((p)->elements - 1 + ((p)->size)) || 1); + +// missing in old interface. Currently called by initSparkPools +// internally. +SparkPool* initPool(StgWord size); + +// special case: accessing our own pool, at the write end +// otherwise, we can always steal from our pool as the others do... +StgClosure* reclaimSpark(Capability *cap); + +rtsBool looksEmpty(SparkPool* deque); + +// rest: same as old interface StgClosure * findSpark (Capability *cap); void initSparkPools (void); -void markSparkQueue (evac_fn evac); +void freeSparkPool (SparkPool *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); +INLINE_HEADER void discardSparks (SparkPool *pool); +INLINE_HEADER nat sparkPoolSize (SparkPool *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 - /* ----------------------------------------------------------------------------- * PRIVATE below here * -------------------------------------------------------------------------- */ #if defined(PARALLEL_HASKELL) || defined(THREADED_RTS) -INLINE_HEADER rtsBool -emptySparkPool (StgSparkPool *pool) -{ - return (pool->hd == pool->tl); -} +INLINE_HEADER rtsBool +emptySparkPool (SparkPool *pool) +{ return looksEmpty(pool); } INLINE_HEADER rtsBool emptySparkPoolCap (Capability *cap) -{ return emptySparkPool(&cap->r.rSparks); } +{ return looksEmpty(cap->sparks); } INLINE_HEADER nat -sparkPoolSize (StgSparkPool *pool) +sparkPoolSize (SparkPool *pool) { - if (pool->hd <= pool->tl) { - return (pool->hd - pool->tl); - } else { - return (pool->lim - pool->hd + pool->tl - pool->base); - } + return (pool->bottom - pool->top); } INLINE_HEADER nat sparkPoolSizeCap (Capability *cap) -{ return sparkPoolSize(&cap->r.rSparks); } +{ return sparkPoolSize(cap->sparks); } INLINE_HEADER void -discardSparks (StgSparkPool *pool) +discardSparks (SparkPool *pool) { - pool->hd = pool->tl; + pool->top = pool->bottom = 0; } 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; } +{ return discardSparks(cap->sparks); } #endif