X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FSparks.c;h=7e2556d9760ba1f3eee029a22c489865f36fdf25;hb=fff1f6194c3c39de53cd645bda9865fb131b1c68;hp=ff4beb7fd58db9897de1aa14ba8b463a2074b58d;hpb=a2a67cd520b9841114d69a87a423dabcb3b4368e;p=ghc-hetmet.git diff --git a/rts/Sparks.c b/rts/Sparks.c index ff4beb7..7e2556d 100644 --- a/rts/Sparks.c +++ b/rts/Sparks.c @@ -45,9 +45,9 @@ createSparkThread (Capability *cap) StgTSO *tso; tso = createIOThread (cap, RtsFlags.GcFlags.initialStkSize, - &base_GHCziConc_runSparks_closure); + (StgClosure *)runSparks_closure); - postEvent(cap, EVENT_CREATE_SPARK_THREAD, 0, tso->id); + traceEventCreateSparkThread(cap, tso->id); appendToRunQueue(cap,tso); } @@ -75,8 +75,6 @@ newSpark (StgRegTable *reg, StgClosure *p) cap->sparks_created++; - postEvent(cap, EVENT_CREATE_SPARK, cap->r.rCurrentTSO->id, 0); - return 1; } @@ -114,7 +112,7 @@ tryStealSpark (Capability *cap) * -------------------------------------------------------------------------- */ void -pruneSparkQueue (evac_fn evac, void *user, Capability *cap) +pruneSparkQueue (Capability *cap) { SparkPool *pool; StgClosurePtr spark, tmp, *elements; @@ -140,7 +138,7 @@ pruneSparkQueue (evac_fn evac, void *user, Capability *cap) pool->top &= pool->moduloSize; pool->topBound = pool->top; - debugTrace(DEBUG_sched, + debugTrace(DEBUG_sparks, "markSparkQueue: current spark queue len=%ld; (hd=%ld; tl=%ld)", sparkPoolSize(pool), pool->bottom, pool->top); @@ -210,17 +208,21 @@ pruneSparkQueue (evac_fn evac, void *user, Capability *cap) pruned_sparks++; // discard spark cap->sparks_pruned++; } - } else { - if (!(closure_flags[INFO_PTR_TO_STRUCT(info)->type] & _NS)) { + } else if (HEAP_ALLOCED(spark) && + (Bdescr((P_)spark)->flags & BF_EVACUATED)) { + if (closure_SHOULD_SPARK(spark)) { elements[botInd] = spark; // keep entry (new address) - evac (user, &elements[botInd]); botInd++; n++; } else { pruned_sparks++; // discard spark cap->sparks_pruned++; } + } else { + pruned_sparks++; // discard spark + cap->sparks_pruned++; } + currInd++; // in the loop, we may reach the bounds, and instantly wrap around @@ -238,9 +240,9 @@ pruneSparkQueue (evac_fn evac, void *user, Capability *cap) pool->bottom = (oldBotInd <= botInd) ? botInd : (botInd + pool->size); // first free place we did not use (corrected by wraparound) - debugTrace(DEBUG_sched, "pruned %d sparks", pruned_sparks); + debugTrace(DEBUG_sparks, "pruned %d sparks", pruned_sparks); - debugTrace(DEBUG_sched, + debugTrace(DEBUG_sparks, "new spark queue len=%ld; (hd=%ld; tl=%ld)", sparkPoolSize(pool), pool->bottom, pool->top); @@ -274,7 +276,7 @@ traverseSparkQueue (evac_fn evac, void *user, Capability *cap) top++; } - debugTrace(DEBUG_sched, + debugTrace(DEBUG_sparks, "traversed spark queue, len=%ld; (hd=%ld; tl=%ld)", sparkPoolSize(pool), pool->bottom, pool->top); }