Commit d07d5ed8 authored by Simon Marlow's avatar Simon Marlow
Browse files

move markSparkQueue into GC.c, as it needs the register variable defined

parent 06726aa7
......@@ -101,74 +101,6 @@ findSpark (Capability *cap)
return NULL;
}
/* -----------------------------------------------------------------------------
* Mark all nodes pointed to by sparks in the spark queues (for GC) Does an
* implicit slide i.e. after marking all sparks are at the beginning of the
* spark pool and the spark pool only contains sparkable closures
* -------------------------------------------------------------------------- */
void
markSparkQueue (evac_fn evac, Capability *cap)
{
StgClosure **sparkp, **to_sparkp;
nat n, pruned_sparks; // stats only
StgSparkPool *pool;
PAR_TICKY_MARK_SPARK_QUEUE_START();
n = 0;
pruned_sparks = 0;
pool = &(cap->r.rSparks);
ASSERT_SPARK_POOL_INVARIANTS(pool);
#if defined(PARALLEL_HASKELL)
// stats only
n = 0;
pruned_sparks = 0;
#endif
sparkp = pool->hd;
to_sparkp = pool->hd;
while (sparkp != pool->tl) {
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++;
}
sparkp++;
if (sparkp == pool->lim) {
sparkp = pool->base;
}
}
pool->tl = to_sparkp;
PAR_TICKY_MARK_SPARK_QUEUE_END(n);
#if defined(PARALLEL_HASKELL)
debugTrace(DEBUG_sched,
"marked %d sparks and pruned %d sparks on [%x]",
n, pruned_sparks, mytid);
#else
debugTrace(DEBUG_sched,
"marked %d sparks and pruned %d sparks",
n, pruned_sparks);
#endif
debugTrace(DEBUG_sched,
"new spark queue len=%d; (hd=%p; tl=%p)\n",
sparkPoolSize(pool), pool->hd, pool->tl);
}
/* -----------------------------------------------------------------------------
*
* Turn a spark into a real thread
......
......@@ -13,7 +13,6 @@
StgClosure * findSpark (Capability *cap);
void initSparkPools (void);
void freeSparkPool (StgSparkPool *pool);
void markSparkQueue (evac_fn evac, Capability *cap);
void createSparkThread (Capability *cap, StgClosure *p);
INLINE_HEADER void discardSparks (StgSparkPool *pool);
......
......@@ -691,6 +691,76 @@ GarbageCollect ( rtsBool force_major_gc )
gct = saved_gct;
}
/* -----------------------------------------------------------------------------
* Mark all nodes pointed to by sparks in the spark queues (for GC) Does an
* implicit slide i.e. after marking all sparks are at the beginning of the
* spark pool and the spark pool only contains sparkable closures
* -------------------------------------------------------------------------- */
#ifdef THREADED_RTS
static void
markSparkQueue (evac_fn evac, Capability *cap)
{
StgClosure **sparkp, **to_sparkp;
nat n, pruned_sparks; // stats only
StgSparkPool *pool;
PAR_TICKY_MARK_SPARK_QUEUE_START();
n = 0;
pruned_sparks = 0;
pool = &(cap->r.rSparks);
ASSERT_SPARK_POOL_INVARIANTS(pool);
#if defined(PARALLEL_HASKELL)
// stats only
n = 0;
pruned_sparks = 0;
#endif
sparkp = pool->hd;
to_sparkp = pool->hd;
while (sparkp != pool->tl) {
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++;
}
sparkp++;
if (sparkp == pool->lim) {
sparkp = pool->base;
}
}
pool->tl = to_sparkp;
PAR_TICKY_MARK_SPARK_QUEUE_END(n);
#if defined(PARALLEL_HASKELL)
debugTrace(DEBUG_sched,
"marked %d sparks and pruned %d sparks on [%x]",
n, pruned_sparks, mytid);
#else
debugTrace(DEBUG_sched,
"marked %d sparks and pruned %d sparks",
n, pruned_sparks);
#endif
debugTrace(DEBUG_sched,
"new spark queue len=%d; (hd=%p; tl=%p)\n",
sparkPoolSize(pool), pool->hd, pool->tl);
}
#endif
/* ---------------------------------------------------------------------------
Where are the roots that we know about?
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment