core: use g_unix_signal_add() for more reliable Unix signal handling

There were a few problems with MM's existing signal handling, first
of which was that calling g_main_loop_quit() from a signal handler
only works 50% of the time due to severe restrictions on what you
can do from the handler.  This caused INT or TERM to sometimes be
ignored by MM.

Instead, use the glib signal functions which ensure that the handler
is run in the right context, where we can do anything we want.
This commit is contained in:
Dan Williams
2013-02-12 15:48:39 -06:00
parent 625e1c4884
commit 2d700043ab
3 changed files with 11 additions and 34 deletions

View File

@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <gio/gio.h>
#include <glib-unix.h>
#include "ModemManager.h"
@@ -39,33 +40,15 @@
static GMainLoop *loop;
static MMManager *manager;
static void
mm_signal_handler (int signo)
static gboolean
quit_cb (gpointer user_data)
{
if (signo == SIGUSR1)
mm_log_usr1 ();
else if (signo == SIGINT || signo == SIGTERM) {
mm_info ("Caught signal %d, shutting down...", signo);
if (loop)
g_main_loop_quit (loop);
else
_exit (0);
}
}
static void
setup_signals (void)
{
struct sigaction action;
sigset_t mask;
sigemptyset (&mask);
action.sa_handler = mm_signal_handler;
action.sa_mask = mask;
action.sa_flags = 0;
sigaction (SIGUSR1, &action, NULL);
sigaction (SIGTERM, &action, NULL);
sigaction (SIGINT, &action, NULL);
mm_info ("Caught signal, shutting down...");
if (loop)
g_idle_add ((GSourceFunc) g_main_loop_quit, loop);
else
_exit (0);
return FALSE;
}
static void
@@ -139,7 +122,8 @@ main (int argc, char *argv[])
exit (1);
}
setup_signals ();
g_unix_signal_add (SIGTERM, quit_cb, NULL);
g_unix_signal_add (SIGINT, quit_cb, NULL);
mm_info ("ModemManager (version " MM_DIST_VERSION ") starting...");

View File

@@ -246,11 +246,6 @@ mm_log_setup (const char *level,
return TRUE;
}
void
mm_log_usr1 (void)
{
}
void
mm_log_shutdown (void)
{

View File

@@ -56,8 +56,6 @@ gboolean mm_log_setup (const char *level,
gboolean debug_func_loc,
GError **error);
void mm_log_usr1 (void);
void mm_log_shutdown (void);
#endif /* MM_LOG_H */