[project @ 2001-08-29 14:20:14 by rje]
[ghc-hetmet.git] / ghc / rts / Signals.c
index 037e427..d476a01 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: Signals.c,v 1.19 2001/01/24 15:38:14 simonmar Exp $
+ * $Id: Signals.c,v 1.21 2001/08/14 13:40:09 sewardj Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -7,8 +7,9 @@
  *
  * ---------------------------------------------------------------------------*/
 
-#define NON_POSIX_SOURCE
-
+/* This is non=Posix compliant.
+   #include "PosixSource.h" 
+*/
 #include "Rts.h"
 #include "SchedAPI.h"
 #include "Schedule.h"
 #include "RtsFlags.h"
 #include "StablePriv.h"
 
+#ifdef alpha_TARGET_ARCH
+#include <machine/fpu.h>
+#endif
+
 #ifndef mingw32_TARGET_OS
 
 #ifndef PAR
@@ -285,6 +290,11 @@ shutdown_handler(int sig STG_UNUSED)
  * Haskell code may install their own SIGINT handler, which is
  * fine, provided they're so kind as to put back the old one
  * when they de-install.
+ *
+ * In addition to handling SIGINT, the RTS also handles SIGFPE
+ * by ignoring it.  Apparently IEEE requires floating-point
+ * exceptions to be ignored by default, but alpha-dec-osf3
+ * doesn't seem to do so.
  */
 void
 init_default_handlers()
@@ -303,6 +313,17 @@ init_default_handlers()
     }
 
     siginterrupt(SIGINT, 1);
+
+    action.sa_handler = SIG_IGN;
+    sigemptyset(&action.sa_mask);
+    action.sa_flags = 0;
+    if (sigaction(SIGFPE, &action, &oact) != 0) {
+      /* Oh well, at least we tried. */
+      prog_belch("failed to install SIGFPE handler");
+    }
+#ifdef alpha_TARGET_ARCH
+    ieee_set_fp_control(0);
+#endif
 }
 
 #endif /*! mingw32_TARGET_OS */