diff options
author | William Jon McCann <jmccann@redhat.com> | 2008-03-10 23:02:15 +0000 |
---|---|---|
committer | William Jon McCann <mccann@src.gnome.org> | 2008-03-10 23:02:15 +0000 |
commit | 20ff1876e77203d3530c6cf8e4f45862e97254e3 (patch) | |
tree | afa292e3b2af07e21bb07733cfd16c74569c89c5 /common | |
parent | ca0aaedcb657fd3084d7573680901d43a536a86d (diff) | |
download | gdm-20ff1876e77203d3530c6cf8e4f45862e97254e3.tar.gz |
Don't glog in the signal handlers. Add a default SIGTRAP handler so we get
2008-03-10 William Jon McCann <jmccann@redhat.com>
* common/gdm-signal-handler.c: (signal_io_watch),
(crashlogger_get_backtrace), (gdm_signal_handler_backtrace),
(signal_handler), (gdm_signal_handler_add_fatal):
* common/gdm-signal-handler.h:
* daemon/main.c: (signal_cb), (main):
* gui/simple-greeter/greeter-main.c: (signal_cb), (main):
Don't glog in the signal handlers. Add a default
SIGTRAP handler so we get backtraces in unstable releases.
svn path=/trunk/; revision=5991
Diffstat (limited to 'common')
-rw-r--r-- | common/gdm-signal-handler.c | 34 | ||||
-rw-r--r-- | common/gdm-signal-handler.h | 1 |
2 files changed, 24 insertions, 11 deletions
diff --git a/common/gdm-signal-handler.c b/common/gdm-signal-handler.c index 2c46de58..91d90308 100644 --- a/common/gdm-signal-handler.c +++ b/common/gdm-signal-handler.c @@ -126,10 +126,12 @@ signal_io_watch (GIOChannel *ioc, data = g_hash_table_lookup (handler->priv->id_lookup, l->data); if (data != NULL) { - g_debug ("GdmSignalHandler: running %d handler: %p", signum, data->func); - res = data->func (signum, data->data); - if (! res) { - is_fatal = TRUE; + if (data->func != NULL) { + g_debug ("GdmSignalHandler: running %d handler: %p", signum, data->func); + res = data->func (signum, data->data); + if (! res) { + is_fatal = TRUE; + } } } } @@ -181,7 +183,7 @@ crashlogger_get_backtrace (void) gboolean success = FALSE; int pid; - pid = fork(); + pid = fork (); if (pid > 0) { /* Wait for the child to finish */ int estatus; @@ -193,8 +195,8 @@ crashlogger_get_backtrace (void) } } else if (pid == 0) { /* Child process */ - execl (LIBEXECDIR"/gdm-crash-logger", - LIBEXECDIR"/gdm-crash-logger", NULL); + execl (LIBEXECDIR "/gdm-crash-logger", + LIBEXECDIR "/gdm-crash-logger", NULL); } return success; @@ -211,7 +213,7 @@ gdm_signal_handler_backtrace (void) * we get much better information out of it. Otherwise * fall back to execinfo. */ - if (g_stat (LIBEXECDIR"/gdm-crash-logger", &s) == 0) { + if (g_stat (LIBEXECDIR "/gdm-crash-logger", &s) == 0) { fallback = crashlogger_get_backtrace () ? FALSE : TRUE; } @@ -239,7 +241,7 @@ signal_handler (int signo) case SIGBUS: case SIGILL: case SIGABRT: - g_warning ("Caught signal %d. Generating backtrace...", signo); + case SIGTRAP: gdm_signal_handler_backtrace (); exit (1); break; @@ -247,8 +249,6 @@ signal_handler (int signo) case SIGPIPE: /* let the fatal signals interrupt us */ --in_fatal; - - g_warning ("Caught signal %d, shutting down abnormally. Generating backtrace...", signo); gdm_signal_handler_backtrace (); ignore = write (signal_pipes [1], &signo_byte, 1); break; @@ -333,6 +333,18 @@ gdm_signal_handler_add (GdmSignalHandler *handler, return cdata->id; } +void +gdm_signal_handler_add_fatal (GdmSignalHandler *handler) +{ + g_return_if_fail (GDM_IS_SIGNAL_HANDLER (handler)); + + gdm_signal_handler_add (handler, SIGILL, NULL, NULL); + gdm_signal_handler_add (handler, SIGBUS, NULL, NULL); + gdm_signal_handler_add (handler, SIGSEGV, NULL, NULL); + gdm_signal_handler_add (handler, SIGABRT, NULL, NULL); + gdm_signal_handler_add (handler, SIGTRAP, NULL, NULL); +} + static void callback_data_free (CallbackData *d) { diff --git a/common/gdm-signal-handler.h b/common/gdm-signal-handler.h index 609ef17e..84ccbc6d 100644 --- a/common/gdm-signal-handler.h +++ b/common/gdm-signal-handler.h @@ -56,6 +56,7 @@ GdmSignalHandler * gdm_signal_handler_new (void); void gdm_signal_handler_set_main_loop (GdmSignalHandler *handler, GMainLoop *main_loop); +void gdm_signal_handler_add_fatal (GdmSignalHandler *handler); guint gdm_signal_handler_add (GdmSignalHandler *handler, int signal_number, GdmSignalHandlerFunc callback, |