Gather timing stats for a Task when it completes.
[ghc-hetmet.git] / rts / Schedule.c
index 52fd4d5..bd8ba74 100644 (file)
@@ -416,8 +416,6 @@ schedule (Capability *initialCapability, Task *task)
     //     needs to acquire all the capabilities).  We can't kill
     //     threads involved in foreign calls.
     // 
-    //   * sched_state := SCHED_INTERRUPTED
-    //
     //   * somebody calls shutdownHaskell(), which calls exitScheduler()
     //
     //   * sched_state := SCHED_SHUTTING_DOWN
@@ -443,9 +441,6 @@ schedule (Capability *initialCapability, Task *task)
        /* scheduleDoGC() deletes all the threads */
        cap = scheduleDoGC(cap,task,rtsFalse,GetRoots);
        break;
-    case SCHED_INTERRUPTED:
-       IF_DEBUG(scheduler, sched_belch("SCHED_INTERRUPTED"));
-       break;
     case SCHED_SHUTTING_DOWN:
        IF_DEBUG(scheduler, sched_belch("SCHED_SHUTTING_DOWN"));
        // If we are a worker, just exit.  If we're a bound thread
@@ -2060,7 +2055,7 @@ scheduleDoGC (Capability *cap, Task *task USED_IF_THREADS,
      */
     if (sched_state >= SCHED_INTERRUPTING) {
        deleteAllThreads(&capabilities[0]);
-       sched_state = SCHED_INTERRUPTED;
+       sched_state = SCHED_SHUTTING_DOWN;
     }
 
     /* everybody back, start the GC.
@@ -2805,7 +2800,7 @@ workerStart(Task *task)
 
     // On exit from schedule(), we have a Capability.
     releaseCapability(cap);
-    taskStop(task);
+    workerTaskStop(task);
 }
 #endif
 
@@ -2901,7 +2896,7 @@ exitScheduler( void )
 #endif
 
     // If we haven't killed all the threads yet, do it now.
-    if (sched_state < SCHED_INTERRUPTED) {
+    if (sched_state < SCHED_SHUTTING_DOWN) {
        sched_state = SCHED_INTERRUPTING;
        scheduleDoGC(NULL,task,rtsFalse,GetRoots);    
     }
@@ -3016,17 +3011,15 @@ static void (*extra_roots)(evac_fn);
 static void
 performGC_(rtsBool force_major, void (*get_roots)(evac_fn))
 {
-    Task *task = myTask();
-
-    if (task == NULL) {
-       ACQUIRE_LOCK(&sched_mutex);
-       task = newBoundTask();
-       RELEASE_LOCK(&sched_mutex);
-       scheduleDoGC(NULL,task,force_major, get_roots);
-       boundTaskExiting(task);
-    } else {
-       scheduleDoGC(NULL,task,force_major, get_roots);
-    }
+    Task *task;
+    // We must grab a new Task here, because the existing Task may be
+    // associated with a particular Capability, and chained onto the 
+    // suspended_ccalling_tasks queue.
+    ACQUIRE_LOCK(&sched_mutex);
+    task = newBoundTask();
+    RELEASE_LOCK(&sched_mutex);
+    scheduleDoGC(NULL,task,force_major, get_roots);
+    boundTaskExiting(task);
 }
 
 void