X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=rts%2FSchedule.c;h=bd8ba743debe8f352286122dc90a9a4ac528e468;hp=52fd4d5df655f76668314dc399cb0fca1111d88c;hb=a91cc8496bf4ea7fe1e3ad9d97836152f3939ffa;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1 diff --git a/rts/Schedule.c b/rts/Schedule.c index 52fd4d5..bd8ba74 100644 --- a/rts/Schedule.c +++ b/rts/Schedule.c @@ -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