rtsBool retry;
nat i = 0;
- if (!emptyRunQueue(cap)) {
+ if (!emptyRunQueue(cap) || cap->returning_tasks_hd != NULL) {
// If there are other threads, don't try to run any new
// sparks: sparks might be speculative, we don't want to take
// resources away from the main computation.
return 0;
}
- // first try to get a spark from our own pool.
- // We should be using reclaimSpark(), because it works without
- // needing any atomic instructions:
- // spark = reclaimSpark(cap->sparks);
- // However, measurements show that this makes at least one benchmark
- // slower (prsa) and doesn't affect the others.
- spark = tryStealSpark(cap);
- if (spark != NULL) {
- cap->sparks_converted++;
+ do {
+ retry = rtsFalse;
- // Post event for running a spark from capability's own pool.
- traceSchedEvent(cap, EVENT_RUN_SPARK, cap->r.rCurrentTSO, 0);
+ // first try to get a spark from our own pool.
+ // We should be using reclaimSpark(), because it works without
+ // needing any atomic instructions:
+ // spark = reclaimSpark(cap->sparks);
+ // However, measurements show that this makes at least one benchmark
+ // slower (prsa) and doesn't affect the others.
+ spark = tryStealSpark(cap);
+ if (spark != NULL) {
+ cap->sparks_converted++;
- return spark;
- }
+ // Post event for running a spark from capability's own pool.
+ traceSchedEvent(cap, EVENT_RUN_SPARK, cap->r.rCurrentTSO, 0);
- if (n_capabilities == 1) { return NULL; } // makes no sense...
+ return spark;
+ }
+ if (!emptySparkPoolCap(cap)) {
+ retry = rtsTrue;
+ }
- debugTrace(DEBUG_sched,
- "cap %d: Trying to steal work from other capabilities",
- cap->no);
+ if (n_capabilities == 1) { return NULL; } // makes no sense...
- do {
- retry = rtsFalse;
+ debugTrace(DEBUG_sched,
+ "cap %d: Trying to steal work from other capabilities",
+ cap->no);
/* visit cap.s 0..n-1 in sequence until a theft succeeds. We could
start at a random place instead of 0 as well. */
cap->no = i;
cap->in_haskell = rtsFalse;
- cap->in_gc = rtsFalse;
cap->run_queue_hd = END_TSO_QUEUE;
cap->run_queue_tl = END_TSO_QUEUE;
cap->free_trec_headers = NO_TREC;
cap->transaction_tokens = 0;
cap->context_switch = 0;
+ cap->pinned_object_block = NULL;
}
/* ---------------------------------------------------------------------------
freeCapability (Capability *cap)
{
stgFree(cap->mut_lists);
+ stgFree(cap->saved_mut_lists);
#if defined(THREADED_RTS)
freeSparkPool(cap->sparks);
#endif