X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FSparks.c;h=0ff4ee4cceaef9227b227e437775ee542d4351d0;hb=eb64777602e77588cb781865f742fa23fad06d08;hp=68ad19ddd3939ba112040ffe641bb4b9de5ffe24;hpb=5a2769f0273dd389977e8283375e7920d183bdd4;p=ghc-hetmet.git diff --git a/rts/Sparks.c b/rts/Sparks.c index 68ad19d..0ff4ee4 100644 --- a/rts/Sparks.c +++ b/rts/Sparks.c @@ -8,9 +8,9 @@ #include "PosixSource.h" #include "Rts.h" +#include "Storage.h" #include "Schedule.h" #include "SchedAPI.h" -#include "Storage.h" #include "RtsFlags.h" #include "RtsUtils.h" #include "ParTicky.h" @@ -63,6 +63,11 @@ initSparkPools( void ) #endif } +void +freeSparkPool(StgSparkPool *pool) { + stgFree(pool->base); +} + /* ----------------------------------------------------------------------------- * * findSpark: find a spark on the current Capability that we can fork @@ -129,13 +134,15 @@ markSparkQueue (evac_fn evac) sparkp = pool->hd; to_sparkp = pool->hd; while (sparkp != pool->tl) { - ASSERT(to_sparkp<=sparkp); ASSERT(*sparkp!=NULL); ASSERT(LOOKS_LIKE_CLOSURE_PTR(((StgClosure *)*sparkp))); // ToDo?: statistics gathering here (also for GUM!) if (closure_SHOULD_SPARK(*sparkp)) { evac(sparkp); *to_sparkp++ = *sparkp; + if (to_sparkp == pool->lim) { + to_sparkp = pool->base; + } n++; } else { pruned_sparks++; @@ -193,6 +200,12 @@ newSpark (StgRegTable *reg, StgClosure *p) { StgSparkPool *pool = &(reg->rSparks); + /* I am not sure whether this is the right thing to do. + * Maybe it is better to exploit the tag information + * instead of throwing it away? + */ + p = UNTAG_CLOSURE(p); + ASSERT_SPARK_POOL_INVARIANTS(pool); if (closure_SHOULD_SPARK(p)) {