X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FItimer.c;h=5b10a5bbbc3f34cb1c65ad5f6196fa3e3214adf0;hb=82ef9f143c6924705aee429c561679e62962b519;hp=07d6dcd6fe80e572df9bb10ddf7189aebc15cf0c;hpb=5a4ec9379ff8e96ab7a75ea1854bf2005db01050;p=ghc-hetmet.git diff --git a/ghc/rts/Itimer.c b/ghc/rts/Itimer.c index 07d6dcd..5b10a5b 100644 --- a/ghc/rts/Itimer.c +++ b/ghc/rts/Itimer.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Itimer.c,v 1.17 2000/08/25 13:12:07 simonmar Exp $ + * $Id: Itimer.c,v 1.22 2001/03/02 10:52:15 simonmar Exp $ * * (c) The GHC Team, 1995-1999 * @@ -49,18 +49,10 @@ lnat total_ticks = 0; /* ticks left before next pre-emptive context switch */ int ticks_to_ctxt_switch = 0; -static -void -#if defined(mingw32_TARGET_OS) || (defined(cygwin32_TARGET_OS) && !defined(HAVE_SETITIMER)) -CALLBACK -#endif -handle_tick(int unused STG_UNUSED); - /* ----------------------------------------------------------------------------- Tick handler - We use the ticker for two things: supporting threadDelay, and time - profiling. + We use the ticker for time profiling. SMP note: this signal could be delivered to *any* thread. We have to ensure that it doesn't matter which thread actually runs the @@ -71,8 +63,11 @@ static void #if defined(mingw32_TARGET_OS) || (defined(cygwin32_TARGET_OS) && !defined(HAVE_SETITIMER)) CALLBACK -#endif +handle_tick(UINT uID STG_UNUSED, UINT uMsg STG_UNUSED, DWORD dwUser STG_UNUSED, + DWORD dw1 STG_UNUSED, DWORD d STG_UNUSED) +#else handle_tick(int unused STG_UNUSED) +#endif { total_ticks++; @@ -85,10 +80,12 @@ handle_tick(int unused STG_UNUSED) */ ticks_since_timestamp++; - ticks_to_ctxt_switch--; - if (ticks_to_ctxt_switch <= 0) { - ticks_to_ctxt_switch = RtsFlags.ConcFlags.ctxtSwitchTicks; - context_switch = 1; /* schedule a context switch */ + if (RtsFlags.ConcFlags.ctxtSwitchTicks > 0) { + ticks_to_ctxt_switch--; + if (ticks_to_ctxt_switch <= 0) { + ticks_to_ctxt_switch = RtsFlags.ConcFlags.ctxtSwitchTicks; + context_switch = 1; /* schedule a context switch */ + } } } @@ -106,43 +103,35 @@ handle_tick(int unused STG_UNUSED) #if defined(mingw32_TARGET_OS) || (defined(cygwin32_TARGET_OS) && !defined(HAVE_SETITIMER)) -/* - vtalrm_handler is assigned and set up in Signals.c - - vtalrm_id (defined in Signals.c) holds - the system id for the current timer (used to - later block/kill it.) -*/ -extern nat vtalrm_id; -TIMECALLBACK *vtalrm_cback; - +LPTIMECALLBACK vtalrm_cback; + nat initialize_virtual_timer(nat ms) { -# ifdef PROFILING /* On Win32 setups that don't have support for setitimer(), we use the MultiMedia API's timer support. - As the delivery of ticks isn't free, we only - enable it if we really needed, i.e., when profiling. - (the RTS now also needs timer ticks to implement - threadDelay in non-profiling mode, but the pure - Win32 port doesn't support that.....yet.) + The delivery of ticks isn't free; the performance hit should be checked. */ - unsigned int delay,vtalrm_id; + unsigned int delay; + static unsigned int vtalrm_id; - delay = timeBeginPeriod(1); - if (delay == TIMERR_NOCANDO) { /* error of some sort. */ - return delay; + if (ms) { + delay = timeBeginPeriod(1); + if (delay == TIMERR_NOCANDO) { /* error of some sort. */ + return delay; + } + vtalrm_id = + timeSetEvent(ms, /* event every `delay' milliseconds. */ + 1, /* precision is within 1 ms */ + vtalrm_cback, + TIME_CALLBACK_FUNCTION, /* ordinary callback */ + TIME_PERIODIC); + } else { + timeKillEvent(vtalrm_id); + timeEndPeriod(1); } - vtalrm_id = - timeSetEvent(ms, /* event every `delay' milliseconds. */ - 1, /* precision is within 5 millisecs. */ - (LPTIMECALLBACK)vtalrm_cback, - 0, - TIME_PERIODIC); -# endif return 0; } @@ -243,6 +232,7 @@ unblock_vtalrm_signal(void) /* gettimeofday() takes around 1us on our 500MHz PIII. Since we're * only calling it 50 times/s, it shouldn't have any great impact. */ +#if !defined(mingw32_TARGET_OS) unsigned int getourtimeofday(void) { @@ -251,3 +241,10 @@ getourtimeofday(void) return (tv.tv_sec * TICK_FREQUENCY + tv.tv_usec * TICK_FREQUENCY / 1000000); } +#else +unsigned int +getourtimeofday(void) +{ + return ((unsigned int)GetTickCount() * TICK_FREQUENCY) / 1000; +} +#endif