X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FTimer.c;h=b6414f8b04580284b84681b74b53bdbc955eb501;hb=2322bc9a89a9d8a6132a6818ccff6f665d7ed7f1;hp=da4c852f4b3812ffe8684528394e0de0f866dc9a;hpb=b050008e923eb5542deb3a3f7034ffcb2cb26a12;p=ghc-hetmet.git diff --git a/ghc/rts/Timer.c b/ghc/rts/Timer.c index da4c852..b6414f8 100644 --- a/ghc/rts/Timer.c +++ b/ghc/rts/Timer.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------------- * - * (c) The GHC Team, 1995-2003 + * (c) The GHC Team, 1995-2005 * * Interval timer service for profiling and pre-emptive scheduling. * @@ -19,17 +19,17 @@ #include "Proftimer.h" #include "Schedule.h" #include "Timer.h" +#include "Ticker.h" #include "Capability.h" -#if !defined(mingw32_HOST_OS) -#include "Itimer.h" -#else -#include "win32/Ticker.h" -#endif - /* ticks left before next pre-emptive context switch */ static int ticks_to_ctxt_switch = 0; +#if defined(THREADED_RTS) +/* idle ticks left before we perform a GC */ +static int ticks_to_gc = 0; +#endif + /* * Function: handle_tick() * @@ -49,24 +49,33 @@ handle_tick(int unused STG_UNUSED) ticks_to_ctxt_switch = RtsFlags.ConcFlags.ctxtSwitchTicks; context_switch = 1; /* schedule a context switch */ -#if defined(RTS_SUPPORTS_THREADS) +#if defined(THREADED_RTS) /* - * 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. + * If we've been inactive for idleGCDelayTicks (set by +RTS + * -I), 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; + ticks_to_gc = RtsFlags.GcFlags.idleGCDelayTicks; 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 - */ + if (ticks_to_gc == 0) break; /* 0 ==> no idle GC */ + ticks_to_gc--; + if (ticks_to_gc == 0) { + ticks_to_gc = RtsFlags.GcFlags.idleGCDelayTicks; + recent_activity = ACTIVITY_INACTIVE; + blackholes_need_checking = rtsTrue; + /* hack: re-use the blackholes_need_checking flag */ + + /* ToDo: this doesn't work. Can't invoke + * pthread_cond_signal from a signal handler. + * Furthermore, we can't prod a capability that we + * might be holding. What can we do? + */ + prodOneCapability(); + } break; default: break;