X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FItimer.c;h=07d6dcd6fe80e572df9bb10ddf7189aebc15cf0c;hb=5a4ec9379ff8e96ab7a75ea1854bf2005db01050;hp=9117157a165fcf35f9ebeefb7c87e491e7314214;hpb=b598540e19fbf68557e6b4d313f10860c4b9d737;p=ghc-hetmet.git diff --git a/ghc/rts/Itimer.c b/ghc/rts/Itimer.c index 9117157..07d6dcd 100644 --- a/ghc/rts/Itimer.c +++ b/ghc/rts/Itimer.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Itimer.c,v 1.15 2000/07/17 15:09:35 rrt Exp $ + * $Id: Itimer.c,v 1.17 2000/08/25 13:12:07 simonmar Exp $ * * (c) The GHC Team, 1995-1999 * @@ -23,6 +23,7 @@ #endif #include "Rts.h" +#include "RtsFlags.h" #include "Itimer.h" #include "Proftimer.h" #include "Schedule.h" @@ -45,6 +46,9 @@ 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)) @@ -76,10 +80,16 @@ handle_tick(int unused STG_UNUSED) handleProfTick(); #endif - /* For threadDelay etc., see Select.c */ - ticks_since_select++; + /* so we can get a rough indication of the current time at any point + * without having to call gettimeofday() (see Select.c): + */ + ticks_since_timestamp++; - context_switch = 1; + ticks_to_ctxt_switch--; + if (ticks_to_ctxt_switch <= 0) { + ticks_to_ctxt_switch = RtsFlags.ConcFlags.ctxtSwitchTicks; + context_switch = 1; /* schedule a context switch */ + } } @@ -133,6 +143,7 @@ initialize_virtual_timer(nat ms) 0, TIME_PERIODIC); # endif + return 0; } @@ -147,6 +158,9 @@ initialize_virtual_timer(nat ms) # else struct itimerval it; + timestamp = getourtimeofday(); + ticks_since_timestamp = 0; + it.it_value.tv_sec = ms / 1000; it.it_value.tv_usec = 1000 * (ms - (1000 * it.it_value.tv_sec)); it.it_interval = it.it_value; @@ -165,6 +179,9 @@ initialize_virtual_timer(nat ms) struct itimerspec it; timer_t tid; + timestamp = getourtimeofday(); + ticks_since_timestamp = 0; + se.sigev_notify = SIGEV_SIGNAL; se.sigev_signo = SIGVTALRM; se.sigev_value.sival_int = SIGVTALRM; @@ -223,12 +240,14 @@ unblock_vtalrm_signal(void) } #endif -#if !defined(HAVE_SETITIMER) && !defined(mingw32_TARGET_OS) +/* gettimeofday() takes around 1us on our 500MHz PIII. Since we're + * only calling it 50 times/s, it shouldn't have any great impact. + */ unsigned int getourtimeofday(void) { struct timeval tv; gettimeofday(&tv, (struct timezone *) NULL); - return (tv.tv_sec * 1000000 + tv.tv_usec); + return (tv.tv_sec * TICK_FREQUENCY + + tv.tv_usec * TICK_FREQUENCY / 1000000); } -#endif