[project @ 2000-03-17 10:24:44 by simonmar]
[ghc-hetmet.git] / ghc / rts / Signals.c
index 2193349..0b9f3a9 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: Signals.c,v 1.10 1999/11/09 15:46:57 simonmar Exp $
+ * $Id: Signals.c,v 1.15 2000/03/15 15:31:36 simonmar Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -48,8 +48,7 @@ more_handlers(I_ sig)
 
     if (handlers == NULL) {
       /* don't fflush(stdout); WORKAROUND bug in Linux glibc */
-      fprintf(stderr, "VM exhausted (in more_handlers)\n");
-      exit(EXIT_FAILURE);
+      barf("VM exhausted (in more_handlers)");
     }
     for(i = nHandlers; i <= sig; i++)
       /* Fill in the new slots with default actions */
@@ -218,12 +217,9 @@ start_signal_handlers(void)
 
     next_pending_handler--;
 
-    /* create*Thread  puts the thread on the head of the runnable
-     * queue, hence it will be run next.  Poor man's priority
-     * scheduling.
-     */
-    createIOThread(RtsFlags.GcFlags.initialStkSize, 
-                  (StgClosure *) *next_pending_handler);
+    scheduleThread(
+       createIOThread(RtsFlags.GcFlags.initialStkSize, 
+                     (StgClosure *) *next_pending_handler));
   }
 
   unblockUserSignals();
@@ -234,9 +230,7 @@ StgInt
 sig_install(StgInt sig, StgInt spi, StgStablePtr handler, sigset_t *mask)
 {
   /* don't fflush(stdout); WORKAROUND bug in Linux glibc */
-  fprintf(stderr,
-         "No signal handling support in a parallel implementation.\n");
-  exit(EXIT_FAILURE);
+  barf("no signal handling support in a parallel implementation");
 }
 
 void
@@ -270,7 +264,7 @@ shutdown_handler(int sig STG_UNUSED)
   } else
 #endif
 
-  shutdownHaskellAndExit(EXIT_FAILURE);
+    interruptStgRts();
 }
 
 /*
@@ -280,9 +274,13 @@ 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.
+ *
+ * We ignore SIGPIPE, because our I/O library handles EPIPE properly,
+ * and a SIGPIPE tends to cause the program to exit silently and
+ * mysteriously.
  */
 void
-init_shutdown_handler()
+init_default_handlers()
 {
     struct sigaction action,oact;
 
@@ -294,13 +292,13 @@ init_shutdown_handler()
     action.sa_flags = 0;
     if (sigaction(SIGINT, &action, &oact) != 0) {
       /* Oh well, at least we tried. */
-#ifdef DEBUG
-      fprintf(stderr, "init_shutdown_handler: failed to reg SIGINT handler");
-#endif
+      prog_belch("failed to install SIGINT handler");
     }
-}
-
-
 
+    action.sa_handler = SIG_IGN;
+    if (sigaction(SIGPIPE, &action, &oact) != 0) {
+      prog_belch("failed to install SIGINT handler");
+    }
+}
 
 #endif /*! mingw32_TARGET_OS */