X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=rts%2FTimer.c;h=02d106fde9a2553f2f2fa10930df0f0869170921;hp=96ea5e221128f0cbb394b33be527f88e87f402e9;hb=c5b178be60a5a44abd2f4ddf8c399857678326e2;hpb=8f52645bd99ee3e636a34826c0cbfc5939920da1 diff --git a/rts/Timer.c b/rts/Timer.c index 96ea5e2..02d106f 100644 --- a/rts/Timer.c +++ b/rts/Timer.c @@ -14,12 +14,13 @@ * on platform-specific services to install and run the timers. * */ + +#include "PosixSource.h" #include "Rts.h" -#include "RtsFlags.h" + +#include "Timer.h" #include "Proftimer.h" -#include "Storage.h" #include "Schedule.h" -#include "Timer.h" #include "Ticker.h" #include "Capability.h" #include "RtsSignals.h" @@ -75,8 +76,6 @@ handle_tick(int unused STG_UNUSED) ticks_to_gc = RtsFlags.GcFlags.idleGCDelayTime / RtsFlags.MiscFlags.tickInterval; recent_activity = ACTIVITY_INACTIVE; - blackholes_need_checking = rtsTrue; - /* hack: re-use the blackholes_need_checking flag */ wakeUpRts(); } } @@ -87,6 +86,15 @@ handle_tick(int unused STG_UNUSED) #endif } +// This global counter is used to allow multiple threads to stop the +// timer temporarily with a stopTimer()/startTimer() pair. If +// timer_enabled == 0 timer is enabled +// timer_disabled == N, N > 0 timer is disabled by N threads +// When timer_enabled makes a transition to 0, we enable the timer, +// and when it makes a transition to non-0 we disable it. + +static StgWord timer_disabled; + void initTimer(void) { @@ -94,28 +102,33 @@ initTimer(void) if (RtsFlags.MiscFlags.tickInterval != 0) { initTicker(RtsFlags.MiscFlags.tickInterval, handle_tick); } + timer_disabled = 1; } void startTimer(void) { - if (RtsFlags.MiscFlags.tickInterval != 0) { - startTicker(); + if (atomic_dec(&timer_disabled) == 0) { + if (RtsFlags.MiscFlags.tickInterval != 0) { + startTicker(); + } } } void stopTimer(void) { - if (RtsFlags.MiscFlags.tickInterval != 0) { - stopTicker(); + if (atomic_inc(&timer_disabled) == 1) { + if (RtsFlags.MiscFlags.tickInterval != 0) { + stopTicker(); + } } } void -exitTimer(void) +exitTimer (rtsBool wait) { if (RtsFlags.MiscFlags.tickInterval != 0) { - exitTicker(); + exitTicker(wait); } }