X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FSparks.h;h=e2c60e96251d54d1200b2f7ad626aa9b39455c35;hb=c7ea7c15942c6369bcca2cc13012d228a80fe926;hp=4062a0b9813aa7316e04110de1821af3813ab417;hpb=99df892cc9620fcc92747b79bba75dad8a1d295c;p=ghc-hetmet.git diff --git a/rts/Sparks.h b/rts/Sparks.h index 4062a0b..e2c60e9 100644 --- a/rts/Sparks.h +++ b/rts/Sparks.h @@ -51,17 +51,24 @@ typedef struct SparkPool_ { } SparkPool; -/* INVARIANTS, in this order: bottom/top consistent, reasonable size, - topBound consistent, space pointer, space accessible to us */ +/* INVARIANTS, in this order: reasonable size, + topBound consistent, space pointer, space accessible to us. + + NB. This is safe to use only (a) on a spark pool owned by the + current thread, or (b) when there's only one thread running, or no + stealing going on (e.g. during GC). +*/ #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); +// No: it is possible that top > bottom when using reclaimSpark() +// ASSERT((p)->bottom >= (p)->top); +// ASSERT((p)->size > (p)->bottom - (p)->top); + // Initialisation void initSparkPools (void); @@ -73,11 +80,11 @@ StgClosure* reclaimSpark(SparkPool *pool); // if the pool is almost empty). rtsBool looksEmpty(SparkPool* deque); -StgClosure * tryStealSpark (SparkPool *pool); +StgClosure * tryStealSpark (Capability *cap); void freeSparkPool (SparkPool *pool); -void createSparkThread (Capability *cap, StgClosure *p); -void pruneSparkQueues (void); +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 nat sparkPoolSize (SparkPool *pool); @@ -100,7 +107,8 @@ sparkPoolSize (SparkPool *pool) INLINE_HEADER void discardSparks (SparkPool *pool) { - pool->top = pool->topBound = pool->bottom = 0; + pool->top = pool->bottom; +// pool->topBound = pool->top; } #endif