diff options
author | Sean Davis <smd.seandavis@gmail.com> | 2015-05-17 23:25:42 -0400 |
---|---|---|
committer | Sean Davis <smd.seandavis@gmail.com> | 2015-05-17 23:25:42 -0400 |
commit | a2fa1044a4708f8619b78c3e8b607a2b692b4c61 (patch) | |
tree | b1fc198eee0fdb501c8cef0745ba0b65ce9f38ae | |
parent | 1c1b3f2cccdd1d9e5012c42a82c86a4121b191f2 (diff) | |
parent | c28d7371966c5b57d3f8ad43b3d2482e1bd75d0b (diff) | |
download | lightdm-gtk-greeter-git-a2fa1044a4708f8619b78c3e8b607a2b692b4c61.tar.gz |
Merge lp:~lightdm-gtk-greeter-team/lightdm-gtk-greeter/lp-1445461-leave-instance into lp:lightdm-gtk-greeter
-rw-r--r-- | configure.ac | 13 | ||||
-rw-r--r-- | src/lightdm-gtk-greeter.c | 31 |
2 files changed, 38 insertions, 6 deletions
diff --git a/configure.ac b/configure.ac index 9eed4aa..bebdb00 100644 --- a/configure.ac +++ b/configure.ac @@ -132,6 +132,19 @@ AS_IF([test "x$enable_indicator_services_command" != "xno"], ]) dnl ########################################################################### + +AC_ARG_ENABLE([kill-on-sigterm], + AC_HELP_STRING([--enable-kill-on-sigterm], [Kill greeter instance on SIGTERM, see LP1445461]) + AC_HELP_STRING([--disable-kill-on-sigterm], [Don't kill greeter on SIGTERM, see LP1445461']), + [], [enable_kill_on_sigterm=no]) + +AS_IF([test "x$enable_kill_on_sigterm" = "xyes"], +[ + AC_DEFINE([KILL_ON_SIGTERM], [1], [Kill greeter in SIGTERM handler, see LP1445461]) +], +[]) + +dnl ########################################################################### dnl Internationalization dnl ########################################################################### diff --git a/src/lightdm-gtk-greeter.c b/src/lightdm-gtk-greeter.c index 9b2e6c6..1518abc 100644 --- a/src/lightdm-gtk-greeter.c +++ b/src/lightdm-gtk-greeter.c @@ -429,10 +429,27 @@ close_pid (GPid pid, gboolean remove) static void sigterm_cb (gpointer user_data) { - g_slist_foreach (pids_to_close, (GFunc)close_pid, GINT_TO_POINTER (FALSE)); - g_slist_free (pids_to_close); - pids_to_close = NULL; - gtk_main_quit (); + gboolean is_callback = GPOINTER_TO_INT (user_data); + + if (is_callback) + g_debug ("SIGTERM received"); + + if (pids_to_close) + { + g_slist_foreach (pids_to_close, (GFunc)close_pid, GINT_TO_POINTER (FALSE)); + g_slist_free (pids_to_close); + pids_to_close = NULL; + } + + if (is_callback) + { + gtk_main_quit (); + #ifdef KILL_ON_SIGTERM + /* LP: #1445461 */ + g_debug ("Killing greeter with exit()..."); + exit (EXIT_SUCCESS); + #endif + } } /* Power window */ @@ -2605,7 +2622,7 @@ main (int argc, char **argv) bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); - g_unix_signal_add (SIGTERM, (GSourceFunc)sigterm_cb, NULL); + g_unix_signal_add (SIGTERM, (GSourceFunc)sigterm_cb, /* is_callback */ GINT_TO_POINTER (TRUE)); config_init (); @@ -3116,9 +3133,11 @@ main (int argc, char **argv) gtk_widget_show (GTK_WIDGET (screen_overlay)); + g_debug ("Run Gtk loop..."); gtk_main (); + g_debug ("Gtk loop exits"); - g_slist_foreach (pids_to_close, (GFunc)close_pid, NULL); + sigterm_cb (/* is_callback */ GINT_TO_POINTER (FALSE)); return EXIT_SUCCESS; } |