Fix Trac #2467: decent warnings for orphan instances
[ghc-hetmet.git] / rts / posix / Signals.c
index 27f09b0..e34190c 100644 (file)
@@ -429,24 +429,9 @@ stg_sig_install(StgInt sig STG_UNUSED,
  * We like to shutdown nicely after receiving a SIGINT, write out the
  * stats, write profiling info, close open files and flush buffers etc.
  * -------------------------------------------------------------------------- */
-#ifdef SMP
-pthread_t startup_guy;
-#endif
-
 static void
 shutdown_handler(int sig STG_UNUSED)
 {
-#ifdef SMP
-    // if I'm a worker thread, send this signal to the guy who
-    // originally called startupHaskell().  Since we're handling
-    // the signal, it won't be a "send to all threads" type of signal
-    // (according to the POSIX threads spec).
-    if (pthread_self() != startup_guy) {
-       pthread_kill(startup_guy, sig);
-       return;
-    }
-#endif
-
     // If we're already trying to interrupt the RTS, terminate with
     // extreme prejudice.  So the first ^C tries to exit the program
     // cleanly, and the second one just kills it.
@@ -473,14 +458,10 @@ shutdown_handler(int sig STG_UNUSED)
  * doesn't seem to do so.
  * -------------------------------------------------------------------------- */
 void
-initDefaultHandlers()
+initDefaultHandlers(void)
 {
     struct sigaction action,oact;
 
-#ifdef SMP
-    startup_guy = pthread_self();
-#endif
-
     // install the SIGINT handler
     action.sa_handler = shutdown_handler;
     sigemptyset(&action.sa_mask);
@@ -515,6 +496,33 @@ initDefaultHandlers()
 #ifdef alpha_HOST_ARCH
     ieee_set_fp_control(0);
 #endif
+
+    // ignore SIGPIPE; see #1619
+    action.sa_handler = SIG_IGN;
+    sigemptyset(&action.sa_mask);
+    action.sa_flags = 0;
+    if (sigaction(SIGPIPE, &action, &oact) != 0) {
+       sysErrorBelch("warning: failed to install SIGPIPE handler");
+    }
+}
+
+void
+resetDefaultHandlers(void)
+{
+    struct sigaction action;
+
+    action.sa_handler = SIG_DFL;
+    sigemptyset(&action.sa_mask);
+    action.sa_flags = 0;
+
+    // restore SIGINT
+    if (sigaction(SIGINT, &action, NULL) != 0) {
+       sysErrorBelch("warning: failed to uninstall SIGINT handler");
+    }
+    // restore SIGPIPE
+    if (sigaction(SIGPIPE, &action, NULL) != 0) {
+       sysErrorBelch("warning: failed to uninstall SIGPIPE handler");
+    }
 }
 
 void