Commit 635f8049 authored by Simon Marlow's avatar Simon Marlow
Browse files

fix lost context switches in GHCi (fixes test 3429(ghci))

parent 65b61529
......@@ -1188,36 +1188,32 @@ scheduleHandleStackOverflow (Capability *cap, Task *task, StgTSO *t)
static rtsBool
scheduleHandleYield( Capability *cap, StgTSO *t, nat prev_what_next )
{
// Reset the context switch flag. We don't do this just before
// running the thread, because that would mean we would lose ticks
// during GC, which can lead to unfair scheduling (a thread hogs
// the CPU because the tick always arrives during GC). This way
// penalises threads that do a lot of allocation, but that seems
// better than the alternative.
cap->context_switch = 0;
/* put the thread back on the run queue. Then, if we're ready to
* GC, check whether this is the last task to stop. If so, wake
* up the GC thread. getThread will block during a GC until the
* GC is finished.
*/
#ifdef DEBUG
if (t->what_next != prev_what_next) {
debugTrace(DEBUG_sched,
"--<< thread %ld (%s) stopped to switch evaluators",
(long)t->id, what_next_strs[t->what_next]);
}
#endif
ASSERT(t->_link == END_TSO_QUEUE);
// Shortcut if we're just switching evaluators: don't bother
// doing stack squeezing (which can be expensive), just run the
// thread.
if (t->what_next != prev_what_next) {
if (cap->context_switch == 0 && t->what_next != prev_what_next) {
debugTrace(DEBUG_sched,
"--<< thread %ld (%s) stopped to switch evaluators",
(long)t->id, what_next_strs[t->what_next]);
return rtsTrue;
}
// Reset the context switch flag. We don't do this just before
// running the thread, because that would mean we would lose ticks
// during GC, which can lead to unfair scheduling (a thread hogs
// the CPU because the tick always arrives during GC). This way
// penalises threads that do a lot of allocation, but that seems
// better than the alternative.
cap->context_switch = 0;
IF_DEBUG(sanity,
//debugBelch("&& Doing sanity check on yielding TSO %ld.", t->id);
checkTSO(t));
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment