Author: jmb
Date: Tue Jan 2 00:13:02 2007
New Revision: 3132
URL:
http://svn.semichrome.net?rev=3132&view=rev
Log:
Improve signal handling. This should put an end to silent exits.
Modified:
trunk/netsurf/riscos/gui.c
Modified: trunk/netsurf/riscos/gui.c
URL:
http://svn.semichrome.net/trunk/netsurf/riscos/gui.c?rev=3132&r1=3131...
==============================================================================
--- trunk/netsurf/riscos/gui.c (original)
+++ trunk/netsurf/riscos/gui.c Tue Jan 2 00:13:02 2007
@@ -20,6 +20,7 @@
#include <time.h>
#include <features.h>
#include <unixlib/local.h>
+#include <unixlib/sigstate.h>
#include "curl/curl.h"
#include "oslib/font.h"
#include "oslib/help.h"
@@ -775,7 +776,44 @@
"error and must exit. Please submit a bug report, "
"attaching the browser log file." };
- if (sig == SIGFPE || sig == SIGABRT) {
+ ro_gui_cleanup();
+
+ /* Get previous handler of this signal */
+ switch (sig) {
+ case SIGABRT:
+ prev_handler = prev_sigs.sigabrt;
+ break;
+ case SIGFPE:
+ prev_handler = prev_sigs.sigfpe;
+ break;
+ case SIGILL:
+ prev_handler = prev_sigs.sigill;
+ break;
+ case SIGINT:
+ prev_handler = prev_sigs.sigint;
+ break;
+ case SIGSEGV:
+ prev_handler = prev_sigs.sigsegv;
+ break;
+ case SIGTERM:
+ prev_handler = prev_sigs.sigterm;
+ break;
+ default:
+ /* Unexpected signal - force to default so we exit
+ * cleanly */
+ prev_handler = SIG_DFL;
+ break;
+ }
+
+ if (prev_handler != SIG_IGN && prev_handler != SIG_DFL) {
+ /* User-registered handler, so call it direct */
+ prev_handler(sig);
+ } else if (prev_handler == SIG_DFL) {
+ /* Previous handler would be the default. However, if we
+ * get here, it's going to be fatal, anyway, so bail,
+ * after writing context to the log and informing the
+ * user */
+
os_colour old_sand, old_glass;
xwimp_report_error_by_category(&error,
@@ -797,42 +835,10 @@
/*rufl_dump_state();*/
xhourglass_colours(old_sand, old_glass, 0, 0);
xhourglass_off();
- }
- ro_gui_cleanup();
-
- /* Get previous handler of this signal */
- switch (sig) {
- case SIGABRT:
- prev_handler = prev_sigs.sigabrt;
- break;
- case SIGFPE:
- prev_handler = prev_sigs.sigfpe;
- break;
- case SIGILL:
- prev_handler = prev_sigs.sigill;
- break;
- case SIGINT:
- prev_handler = prev_sigs.sigint;
- break;
- case SIGSEGV:
- prev_handler = prev_sigs.sigsegv;
- break;
- case SIGTERM:
- prev_handler = prev_sigs.sigterm;
- break;
- default:
- abort();
- }
-
- if (prev_handler != SIG_IGN && prev_handler != SIG_DFL) {
- /* User-registered handler, so call it direct */
- prev_handler(sig);
- } else if (prev_handler == SIG_DFL) {
- /* Default handler so set handler to that and raise() */
- prev_handler = signal(sig, SIG_DFL);
- if (prev_handler == SIG_ERR)
- abort();
- raise(sig);
+
+ __write_backtrace(sig);
+
+ abort();
}
/* If we reach here, previous handler was either SIG_IGN or
* the user-defined handler returned. In either case, we have