From e30e0fb8ad554adfaf3806aa1a94551aa227af7f Mon Sep 17 00:00:00 2001 From: sof Date: Tue, 27 Nov 2001 01:51:23 +0000 Subject: [PATCH] [project @ 2001-11-27 01:51:23 by sof] Rearranged how the virtual timer 'subsystem' is brought up and down: * "int startVirtTimer(nat ms)" now starts the vtimer/ticker. * "int stopVirtTimer()" shuts down the ticker. i.e., removed install_vtalrm_handler() and initialize_virtual_timer(). --- ghc/rts/Itimer.c | 142 ++++++++++++++++++++++++++++++++------------------ ghc/rts/Itimer.h | 6 +-- ghc/rts/RtsStartup.c | 9 ++-- 3 files changed, 98 insertions(+), 59 deletions(-) diff --git a/ghc/rts/Itimer.c b/ghc/rts/Itimer.c index 98d8ddb..4b3bd0b 100644 --- a/ghc/rts/Itimer.c +++ b/ghc/rts/Itimer.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Itimer.c,v 1.27 2001/11/26 12:58:17 simonpj Exp $ + * $Id: Itimer.c,v 1.28 2001/11/27 01:51:23 sof Exp $ * * (c) The GHC Team, 1995-1999 * @@ -61,6 +61,7 @@ int ticks_to_ctxt_switch = 0; static void #if defined(mingw32_TARGET_OS) || (defined(cygwin32_TARGET_OS) && !defined(HAVE_SETITIMER)) + CALLBACK handle_tick(UINT uID STG_UNUSED, UINT uMsg STG_UNUSED, DWORD dwUser STG_UNUSED, DWORD dw1 STG_UNUSED, DWORD d STG_UNUSED) @@ -97,10 +98,12 @@ handle_tick(int unused STG_UNUSED) #if defined(mingw32_TARGET_OS) || (defined(cygwin32_TARGET_OS) && !defined(HAVE_SETITIMER)) -LPTIMECALLBACK vtalrm_cback; +static LPTIMECALLBACK vtalrm_cback; +static unsigned int vtalrm_id = 0; +static unsigned int period = -1; int -initialize_virtual_timer(nat ms) +startVirtTimer(nat ms) { /* On Win32 setups that don't have support for setitimer(), we use the MultiMedia API's timer @@ -109,50 +112,65 @@ initialize_virtual_timer(nat ms) The delivery of ticks isn't free; the performance hit should be checked. */ unsigned int delay; - static unsigned int vtalrm_id = 0; - static unsigned int period = -1; - - /* A zero argument value means shutdown. */ - if (ms != 0) { - TIMECAPS tc; - - if ( timeGetDevCaps(&tc, sizeof(TIMECAPS)) == TIMERR_NOERROR) { - period = tc.wPeriodMin; - delay = timeBeginPeriod(period); - if (delay == TIMERR_NOCANDO) { /* error of some sort. */ - return -1; - } - } else { + TIMECAPS tc; + + vtalrm_cback = handle_tick; + + if ( timeGetDevCaps(&tc, sizeof(TIMECAPS)) == TIMERR_NOERROR) { + period = tc.wPeriodMin; + delay = timeBeginPeriod(period); + if (delay == TIMERR_NOCANDO) { /* error of some sort. */ return -1; } - - vtalrm_id = - timeSetEvent(ms, /* event every `delay' milliseconds. */ - 1, /* precision is within 1 ms */ - vtalrm_cback, - TIME_CALLBACK_FUNCTION, /* ordinary callback */ - TIME_PERIODIC); } else { - /* Shutdown the MM timer */ - if ( vtalrm_id != 0 ) { - timeKillEvent(vtalrm_id); - } - if (period > 0) { - timeEndPeriod(period); - } + return -1; } - + #ifdef PROFILING initProfTimer(); #endif + vtalrm_id = + timeSetEvent(ms, /* event every `delay' milliseconds. */ + 1, /* precision is within 1 ms */ + vtalrm_cback, + TIME_CALLBACK_FUNCTION, /* ordinary callback */ + TIME_PERIODIC); + + return 0; +} + +int +stopVirtTimer() +{ + /* Shutdown the MM timer */ + if ( vtalrm_id != 0 ) { + timeKillEvent(vtalrm_id); + } + if (period > 0) { + timeEndPeriod(period); + } + return 0; } #else +static +int +install_vtalrm_handler(void) +{ + struct sigaction action; + + action.sa_handler = handle_tick; + + sigemptyset(&action.sa_mask); + action.sa_flags = 0; + + return sigaction(SIGVTALRM, &action, NULL); +} int -initialize_virtual_timer(nat ms) +startVirtTimer(nat ms) { # ifndef HAVE_SETITIMER /* fprintf(stderr, "No virtual timer on this system\n"); */ @@ -160,6 +178,8 @@ initialize_virtual_timer(nat ms) # else struct itimerval it; + install_vtalrm_handler(void) + timestamp = getourtimeofday(); #ifdef PROFILING @@ -173,12 +193,28 @@ initialize_virtual_timer(nat ms) # endif } +int +stopVirtTimer() +{ +# ifndef HAVE_SETITIMER + /* fprintf(stderr, "No virtual timer on this system\n"); */ + return -1; +# else + struct itimerval it; + + it.it_value.tv_sec = 0; + it.it_value.tv_usec = 0; + it.it_interval = it.it_value; + return (setitimer(ITIMER_VIRTUAL, &it, NULL)); +# endif +} + #endif /* !{mingw,cygwin32}_TARGET_OS */ # if 0 /* This is a potential POSIX version */ int -initialize_virtual_timer(nat ms) +startVirtTimer(nat ms) { struct sigevent se; struct itimerspec it; @@ -186,7 +222,9 @@ initialize_virtual_timer(nat ms) timestamp = getourtimeofday(); +#ifdef PROFILING initProfTimer(); +#endif se.sigev_notify = SIGEV_SIGNAL; se.sigev_signo = SIGVTALRM; @@ -199,30 +237,32 @@ initialize_virtual_timer(nat ms) it.it_interval = it.it_value; return timer_settime(tid, TIMER_RELTIME, &it, NULL); } -# endif -#if defined(mingw32_TARGET_OS) || (defined(cygwin32_TARGET_OS) && !defined(HAVE_SETITIMER)) int -install_vtalrm_handler(void) +stopVirtTimer() { - vtalrm_cback = handle_tick; - return 0; -} - -#else -int -install_vtalrm_handler(void) -{ - struct sigaction action; - - action.sa_handler = handle_tick; + struct sigevent se; + struct itimerspec it; + timer_t tid; - sigemptyset(&action.sa_mask); - action.sa_flags = 0; + timestamp = getourtimeofday(); - return sigaction(SIGVTALRM, &action, NULL); + se.sigev_notify = SIGEV_SIGNAL; + se.sigev_signo = SIGVTALRM; + se.sigev_value.sival_int = SIGVTALRM; + if (timer_create(CLOCK_VIRTUAL, &se, &tid)) { + barf("can't create virtual timer"); + } + it.it_value.tv_sec = 0; + it.it_value.tv_nsec = 0; + it.it_interval = it.it_value; + return timer_settime(tid, TIMER_RELTIME, &it, NULL); } +# endif + +#if defined(mingw32_TARGET_OS) || (defined(cygwin32_TARGET_OS) && !defined(HAVE_SETITIMER)) +#else void block_vtalrm_signal(void) { diff --git a/ghc/rts/Itimer.h b/ghc/rts/Itimer.h index 9de549c..3e41e49 100644 --- a/ghc/rts/Itimer.h +++ b/ghc/rts/Itimer.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Itimer.h,v 1.9 2001/11/22 14:25:12 simonmar Exp $ + * $Id: Itimer.h,v 1.10 2001/11/27 01:51:23 sof Exp $ * * (c) The GHC Team 1998-2001 * @@ -15,8 +15,8 @@ */ #define CS_MIN_MILLISECS TICK_MILLISECS /* milliseconds per slice */ -int initialize_virtual_timer ( nat ms ); -int install_vtalrm_handler ( void ); +int startVirtTimer( nat ms ); +int stopVirtTimer ( void ); void block_vtalrm_signal ( void ); void unblock_vtalrm_signal ( void ); unsigned int getourtimeofday ( void ); diff --git a/ghc/rts/RtsStartup.c b/ghc/rts/RtsStartup.c index 438304a..51b1ec9 100644 --- a/ghc/rts/RtsStartup.c +++ b/ghc/rts/RtsStartup.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: RtsStartup.c,v 1.57 2001/11/26 16:54:22 simonmar Exp $ + * $Id: RtsStartup.c,v 1.58 2001/11/27 01:51:23 sof Exp $ * * (c) The GHC Team, 1998-2000 * @@ -162,9 +162,8 @@ startupHaskell(int argc, char *argv[], void (*init_root)(void)) initProfiling2(); #endif - /* start the ticker */ - install_vtalrm_handler(); - initialize_virtual_timer(TICK_MILLISECS); + /* start the virtual timer 'subsystem'. */ + startVirtTimer(TICK_MILLISECS); /* start our haskell execution tasks */ #ifdef SMP @@ -292,7 +291,7 @@ shutdownHaskell(void) exitScheduler(); /* stop the ticker */ - initialize_virtual_timer(0); + stopVirtTimer(); /* reset the standard file descriptors to blocking mode */ resetNonBlockingFd(0); -- 1.7.10.4