pspp: Make a signal that indicates a bug re-raise that signal to exit.
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 2 Oct 2010 17:21:21 +0000 (10:21 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Sat, 2 Oct 2010 17:23:28 +0000 (10:23 -0700)
John Darrington pointed out that exiting with EXIT_FAILURE isn't nearly
emphatic enough here.

src/libpspp/message.c
src/libpspp/message.h
src/ui/terminal/main.c

index 0ca2749d6713b4ec245bae604cdd2e00e7e66c36..ed6d6e7a9b0cc9b3b10df864ddbc30f57a49d926 100644 (file)
@@ -312,7 +312,7 @@ msg_enable (void)
 /* Private functions. */
 
 void
-request_bug_report_and_abort (const char *msg)
+request_bug_report (const char *msg)
 {
   fprintf (stderr, "******************************************************\n");
   fprintf (stderr, "You have discovered a bug in PSPP.  Please report this\n");
@@ -334,7 +334,5 @@ request_bug_report_and_abort (const char *msg)
 #endif
            );
   fprintf (stderr, "******************************************************\n");
-
-  _exit (EXIT_FAILURE);
 }
 
index 7c1110175e052a4ad4ebf3de6475561647772c38..fad7816f19b0c57804248010203fbbda35feb512 100644 (file)
@@ -117,7 +117,7 @@ void msg_ui_disable_warnings (bool);
 
 
 /* Used in panic situations only. */
-void request_bug_report_and_abort (const char *msg) NO_RETURN;
+void request_bug_report (const char *msg);
 
 
 #endif /* message.h */
index 94b21a55742855a05974afae7d0c41d0cf30c392..7d2c97f9f7a343454be3cf2343c101a781433a78 100644 (file)
@@ -155,20 +155,27 @@ fpu_init (void)
 void
 bug_handler(int sig)
 {
+  /* Reset SIG to its default handling so that if it happens again we won't
+     recurse. */
+  signal (sig, SIG_DFL);
+
 #if DEBUGGING
   connect_debugger ();
 #endif
   switch (sig)
     {
     case SIGABRT:
-      request_bug_report_and_abort("Assertion Failure/Abort");
+      request_bug_report("Assertion Failure/Abort");
     case SIGFPE:
-      request_bug_report_and_abort("Floating Point Exception");
+      request_bug_report("Floating Point Exception");
     case SIGSEGV:
-      request_bug_report_and_abort("Segmentation Violation");
+      request_bug_report("Segmentation Violation");
     default:
-      request_bug_report_and_abort("Unknown");
+      request_bug_report("Unknown");
     }
+
+  /* Re-raise the signal so that we terminate with the correct status. */
+  raise (sig);
 }
 
 /* Clean up PSPP in preparation for termination.  */