count "dud" sparks (expressions that were already evaluated when sparked)
[ghc.git] / rts / Capability.c
index 8234359..9f7d152 100644 (file)
@@ -225,6 +225,7 @@ initCapability( Capability *cap, nat i )
     cap->returning_tasks_tl = NULL;
     cap->inbox              = (Message*)END_TSO_QUEUE;
     cap->sparks_created     = 0;
+    cap->sparks_dud         = 0;
     cap->sparks_converted   = 0;
     cap->sparks_pruned      = 0;
 #endif
@@ -456,12 +457,16 @@ releaseCapabilityAndQueueWorker (Capability* cap USED_IF_THREADS)
 
     task = cap->running_task;
 
+    // If the Task is stopped, we shouldn't be yielding, we should
+    // be just exiting.
+    ASSERT(!task->stopped);
+
     // If the current task is a worker, save it on the spare_workers
     // list of this Capability.  A worker can mark itself as stopped,
     // in which case it is not replaced on the spare_worker queue.
     // This happens when the system is shutting down (see
     // Schedule.c:workerStart()).
-    if (!isBoundTask(task) && !task->stopped)
+    if (!isBoundTask(task))
     {
         if (cap->n_spare_workers < MAX_SPARE_WORKERS)
         {