X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FTimer.c;h=0bfea2d6fd9236224c1bec0e359874a9f497d2e1;hb=76c0086f090327eecaf510de8bc4efc4dee996dc;hp=425ada533fcd97546cb1d25f17a4e21359d696cd;hpb=7b2ff4cc95ce49081d84c25184aec796377fbc35;p=ghc-hetmet.git diff --git a/ghc/rts/Timer.c b/ghc/rts/Timer.c index 425ada5..0bfea2d 100644 --- a/ghc/rts/Timer.c +++ b/ghc/rts/Timer.c @@ -21,7 +21,6 @@ #include "Timer.h" #include "Ticker.h" #include "Capability.h" -#include "OSThreads.h" /* ticks left before next pre-emptive context switch */ static int ticks_to_ctxt_switch = 0; @@ -31,10 +30,6 @@ static int ticks_to_ctxt_switch = 0; static int ticks_to_gc = 0; #endif -#if defined(THREADED_RTS) -static void OSThreadProcAttr proddingThread(void *p); -#endif - /* * Function: handle_tick() * @@ -53,53 +48,42 @@ 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(THREADED_RTS) - /* - * 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. + /* + * 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: + 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? */ - switch (recent_activity) { - case ACTIVITY_YES: - recent_activity = ACTIVITY_MAYBE_NO; - ticks_to_gc = RtsFlags.GcFlags.idleGCDelayTicks; - break; - case ACTIVITY_MAYBE_NO: { - OSThreadId id; - 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 */ - - /* We can't prod the Capability from inside the - * signal handler, because pthread_cond_signal() - * doesn't work from signal handlers. Let's hope - * that pthread_create() works: - */ - createOSThread(&id, proddingThread, NULL); - } - break; - } - default: - break; - } -#endif + prodOneCapability(); } + break; + default: + break; } -} - -#if defined(THREADED_RTS) -static void OSThreadProcAttr -proddingThread(void *p STG_UNUSED) -{ - prodOneCapability(); - // and exit again. -} #endif +} int startTimer(nat ms)