summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Jon McCann <jmccann@redhat.com>2008-03-10 23:02:15 +0000
committerWilliam Jon McCann <mccann@src.gnome.org>2008-03-10 23:02:15 +0000
commit20ff1876e77203d3530c6cf8e4f45862e97254e3 (patch)
treeafa292e3b2af07e21bb07733cfd16c74569c89c5
parentca0aaedcb657fd3084d7573680901d43a536a86d (diff)
downloadgdm-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
-rw-r--r--ChangeLog11
-rw-r--r--common/gdm-signal-handler.c34
-rw-r--r--common/gdm-signal-handler.h1
-rw-r--r--daemon/main.c14
-rw-r--r--gui/simple-greeter/greeter-main.c14
5 files changed, 37 insertions, 37 deletions
diff --git a/ChangeLog b/ChangeLog
index 00492b72..1c255742 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
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.
+
+2008-03-10 William Jon McCann <jmccann@redhat.com>
+
* gui/simple-greeter/gdm-greeter-login-window.c:
(gdm_greeter_login_window_class_init):
Remove duplicate signal definition.
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,
diff --git a/daemon/main.c b/daemon/main.c
index 2f8f82cb..21fefc8a 100644
--- a/daemon/main.c
+++ b/daemon/main.c
@@ -442,15 +442,6 @@ signal_cb (int signo,
ret = TRUE;
switch (signo) {
- case SIGSEGV:
- case SIGBUS:
- case SIGILL:
- case SIGABRT:
- g_debug ("Caught signal %d.", signo);
-
- ret = FALSE;
- break;
-
case SIGFPE:
case SIGPIPE:
/* let the fatal signals interrupt us */
@@ -624,14 +615,11 @@ main (int argc,
signal_handler = gdm_signal_handler_new ();
gdm_signal_handler_set_main_loop (signal_handler, main_loop);
+ gdm_signal_handler_add_fatal (signal_handler);
gdm_signal_handler_add (signal_handler, SIGTERM, signal_cb, NULL);
gdm_signal_handler_add (signal_handler, SIGINT, signal_cb, NULL);
- gdm_signal_handler_add (signal_handler, SIGILL, signal_cb, NULL);
- gdm_signal_handler_add (signal_handler, SIGBUS, signal_cb, NULL);
gdm_signal_handler_add (signal_handler, SIGFPE, signal_cb, NULL);
gdm_signal_handler_add (signal_handler, SIGHUP, signal_cb, NULL);
- gdm_signal_handler_add (signal_handler, SIGSEGV, signal_cb, NULL);
- gdm_signal_handler_add (signal_handler, SIGABRT, signal_cb, NULL);
gdm_signal_handler_add (signal_handler, SIGUSR1, signal_cb, NULL);
if (do_timed_exit) {
diff --git a/gui/simple-greeter/greeter-main.c b/gui/simple-greeter/greeter-main.c
index ef13d091..75985d29 100644
--- a/gui/simple-greeter/greeter-main.c
+++ b/gui/simple-greeter/greeter-main.c
@@ -231,15 +231,6 @@ signal_cb (int signo,
ret = TRUE;
switch (signo) {
- case SIGSEGV:
- case SIGBUS:
- case SIGILL:
- case SIGABRT:
- g_debug ("Caught signal %d.", signo);
-
- ret = FALSE;
- break;
-
case SIGFPE:
case SIGPIPE:
/* let the fatal signals interrupt us */
@@ -327,14 +318,11 @@ main (int argc, char *argv[])
gtk_init (&argc, &argv);
signal_handler = gdm_signal_handler_new ();
+ gdm_signal_handler_add_fatal (signal_handler);
gdm_signal_handler_add (signal_handler, SIGTERM, signal_cb, NULL);
gdm_signal_handler_add (signal_handler, SIGINT, signal_cb, NULL);
- gdm_signal_handler_add (signal_handler, SIGILL, signal_cb, NULL);
- gdm_signal_handler_add (signal_handler, SIGBUS, signal_cb, NULL);
gdm_signal_handler_add (signal_handler, SIGFPE, signal_cb, NULL);
gdm_signal_handler_add (signal_handler, SIGHUP, signal_cb, NULL);
- gdm_signal_handler_add (signal_handler, SIGSEGV, signal_cb, NULL);
- gdm_signal_handler_add (signal_handler, SIGABRT, signal_cb, NULL);
gdm_signal_handler_add (signal_handler, SIGUSR1, signal_cb, NULL);
session = gdm_greeter_session_new ();