X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FTimer.c;fp=ghc%2Frts%2FTimer.c;h=da4c852f4b3812ffe8684528394e0de0f866dc9a;hb=b050008e923eb5542deb3a3f7034ffcb2cb26a12;hp=147b4d18553f6a9700cda8e2cb5c6c038c16b762;hpb=8974a27fba33479109297890bd7b618a76eb6f68;p=ghc-hetmet.git diff --git a/ghc/rts/Timer.c b/ghc/rts/Timer.c index 147b4d1..da4c852 100644 --- a/ghc/rts/Timer.c +++ b/ghc/rts/Timer.c @@ -19,6 +19,7 @@ #include "Proftimer.h" #include "Schedule.h" #include "Timer.h" +#include "Capability.h" #if !defined(mingw32_HOST_OS) #include "Itimer.h" @@ -47,6 +48,30 @@ handle_tick(int unused STG_UNUSED) if (ticks_to_ctxt_switch <= 0) { ticks_to_ctxt_switch = RtsFlags.ConcFlags.ctxtSwitchTicks; context_switch = 1; /* schedule a context switch */ + +#if defined(RTS_SUPPORTS_THREADS) + /* + * If we've been inactive for a whole time slice, tell the + * scheduler to wake up and do a GC, to check for threads + * that are deadlocked. + */ + switch (recent_activity) { + case ACTIVITY_YES: + recent_activity = ACTIVITY_MAYBE_NO; + break; + case ACTIVITY_MAYBE_NO: + recent_activity = ACTIVITY_INACTIVE; + blackholes_need_checking = rtsTrue; + /* hack: re-use the blackholes_need_checking flag */ + threadRunnable(); + /* ToDo: this threadRunnable only works if there's + * another thread (not this one) waiting to be woken up + */ + break; + default: + break; + } +#endif } } }