rts: Ignore signal before deleting timer. Fixes #7303.
authorErik de Castro Lopo <erikd@mega-nerd.com>
Sat, 6 Oct 2012 07:23:01 +0000 (17:23 +1000)
committerErik de Castro Lopo <erikd@mega-nerd.com>
Sat, 13 Oct 2012 21:44:40 +0000 (08:44 +1100)
Was getting an ocassional hang or segfault when building GHC in a
Qemu user space emulation of ARM. Turned out that the ITIMER_SIGNAL
was being delivered *after* the call to timer_delete(). Setting the
signal to SIG_IGN before deleting the timer solves the problem.

rts/posix/Itimer.c

index 8c9b1f8..80b3b56 100644 (file)
@@ -204,6 +204,9 @@ void
 exitTicker (rtsBool wait STG_UNUSED)
 {
 #if defined(USE_TIMER_CREATE)
+    // Before deleting the timer set the signal to ignore to avoid the
+    // possibility of the signal being delivered after the timer is deleted.
+    signal(ITIMER_SIGNAL, SIG_IGN);
     timer_delete(timer);
     // ignore errors - we don't really care if it fails.
 #endif