X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fposix%2FItimer.c;h=eb26cd3699bd11a30900e9c1a093d676b5173a89;hb=2ad5ee9e84b9fb2c7df76309c59e23f938632ae9;hp=1fcfa1625e6200580d9bed30851e8d5ca23d1bf3;hpb=f71b024714320a3f1606b3fda36610ac3f043774;p=ghc-hetmet.git diff --git a/rts/posix/Itimer.c b/rts/posix/Itimer.c index 1fcfa16..eb26cd3 100644 --- a/rts/posix/Itimer.c +++ b/rts/posix/Itimer.c @@ -42,6 +42,8 @@ # include #endif +#include + /* Major bogosity: * * In the threaded RTS, we can't set the virtual timer because the @@ -78,9 +80,10 @@ #elif defined(HAVE_SETITIMER) -# ifdef THREADED_RTS +# if defined(THREADED_RTS) || !defined(HAVE_SETITIMER_VIRTUAL) // Oh dear, we have to use SIGALRM if there's no timer_create and // we're using the THREADED_RTS. This leads to problems, see bug #850. +// We also use it if we don't have a virtual timer (trac #2883). # define ITIMER_SIGNAL SIGALRM # define ITIMER_FLAVOUR ITIMER_REAL # else @@ -143,6 +146,9 @@ initTicker (nat ms, TickProc handle_tick) { struct sigevent ev; + // Keep programs like valgrind happy + memset(&ev, 0, sizeof(ev)); + ev.sigev_notify = SIGEV_SIGNAL; ev.sigev_signo = ITIMER_SIGNAL; @@ -259,7 +265,8 @@ getourtimeofday(void) interval = RtsFlags.MiscFlags.tickInterval; if (interval == 0) { interval = 50; } gettimeofday(&tv, (struct timezone *) NULL); - // cast to lnat because nat may be 64 bit when int is only 32 bit - return ((lnat)tv.tv_sec * 1000 / interval + - (lnat)tv.tv_usec / (interval * 1000)); + + // Avoid overflow when we multiply seconds by 1000. See #2848 + return (lnat)((StgWord64)tv.tv_sec * 1000 / interval + + (StgWord64)tv.tv_usec / (interval * 1000)); }