Use error-checking mutexes on all platforms when DEBUG is on
[ghc-hetmet.git] / rts / posix / Itimer.c
index 1fcfa16..6b4ba3b 100644 (file)
@@ -42,6 +42,8 @@
 # include <signal.h>
 #endif
 
+#include <string.h>
+
 /* Major bogosity:
  * 
  * In the threaded RTS, we can't set the virtual timer because the
@@ -143,6 +145,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 +264,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));
 }