diff options
author | Martin Kampas <martin.kampas@tieto.com> | 2014-10-27 07:37:50 +0100 |
---|---|---|
committer | Martyn Russell <martyn@lanedo.com> | 2014-12-27 16:36:46 +0000 |
commit | 963544e4192761d54f334a2eda8e0a33f191df7e (patch) | |
tree | 919ff20f91daa58a7c8070563ce3a73d5429d523 | |
parent | cc84fe205dcb06e820ed778b9813360c8cd02643 (diff) | |
download | tracker-963544e4192761d54f334a2eda8e0a33f191df7e.tar.gz |
Use g_unix_signal_add() for signal handlers
Identified by functional-tests/17-ontology-changes timeouting randomly.
Documentation for g_unix_signal_source_new() explains why it is not safe
to call g_main_loop_quit() from a regular UNIX signal handler.
Intentionally removed the (main_loop != NULL) tests - this cannot happen.
https://bugzilla.gnome.org/show_bug.cgi?id=739234
-rw-r--r-- | src/miners/apps/tracker-main.c | 30 | ||||
-rw-r--r-- | src/miners/fs/tracker-main.c | 30 | ||||
-rw-r--r-- | src/miners/user-guides/tracker-main.c | 30 | ||||
-rw-r--r-- | src/tracker-extract/tracker-main.c | 28 | ||||
-rw-r--r-- | src/tracker-store/tracker-main.vala | 20 | ||||
-rw-r--r-- | src/tracker/tracker-daemon.c | 22 |
6 files changed, 61 insertions, 99 deletions
diff --git a/src/miners/apps/tracker-main.c b/src/miners/apps/tracker-main.c index a6ef75b8d..6d4f01278 100644 --- a/src/miners/apps/tracker-main.c +++ b/src/miners/apps/tracker-main.c @@ -21,10 +21,10 @@ #include <stdlib.h> #include <locale.h> -#include <signal.h> #include <errno.h> #include <glib.h> +#include <glib-unix.h> #include <glib-object.h> #include <glib/gi18n.h> @@ -67,9 +67,11 @@ static GOptionEntry entries[] = { { NULL } }; -static void -signal_handler (int signo) +static gboolean +signal_handler (gpointer user_data) { + int signo = GPOINTER_TO_INT (user_data); + static gboolean in_loop = FALSE; /* Die if we get re-entrant signals handler calls */ @@ -81,11 +83,8 @@ signal_handler (int signo) case SIGTERM: case SIGINT: in_loop = TRUE; - if (main_loop != NULL) { - g_main_loop_quit (main_loop); - } else { - exit (0); - } + g_main_loop_quit (main_loop); + /* Fall through */ default: if (g_strsignal (signo)) { @@ -96,23 +95,16 @@ signal_handler (int signo) } break; } + + return G_SOURCE_CONTINUE; } static void initialize_signal_handler (void) { #ifndef G_OS_WIN32 - struct sigaction act; - sigset_t empty_mask; - - sigemptyset (&empty_mask); - act.sa_handler = signal_handler; - act.sa_mask = empty_mask; - act.sa_flags = 0; - - sigaction (SIGTERM, &act, NULL); - sigaction (SIGINT, &act, NULL); - sigaction (SIGHUP, &act, NULL); + g_unix_signal_add (SIGTERM, signal_handler, GINT_TO_POINTER (SIGTERM)); + g_unix_signal_add (SIGINT, signal_handler, GINT_TO_POINTER (SIGINT)); #endif /* G_OS_WIN32 */ } diff --git a/src/miners/fs/tracker-main.c b/src/miners/fs/tracker-main.c index 2661b881e..31b7bc2be 100644 --- a/src/miners/fs/tracker-main.c +++ b/src/miners/fs/tracker-main.c @@ -22,12 +22,12 @@ #include <string.h> #include <stdlib.h> #include <locale.h> -#include <signal.h> #include <errno.h> #include <sys/types.h> #include <unistd.h> #include <glib.h> +#include <glib-unix.h> #include <glib-object.h> #include <glib/gi18n.h> @@ -120,9 +120,11 @@ sanity_check_option_values (TrackerConfig *config) } } -static void -signal_handler (int signo) +static gboolean +signal_handler (gpointer user_data) { + int signo = GPOINTER_TO_INT (user_data); + static gboolean in_loop = FALSE; /* Die if we get re-entrant signals handler calls */ @@ -134,11 +136,8 @@ signal_handler (int signo) case SIGTERM: case SIGINT: in_loop = TRUE; - if (main_loop != NULL) { - g_main_loop_quit (main_loop); - } else { - exit (0); - } + g_main_loop_quit (main_loop); + /* Fall through */ default: if (g_strsignal (signo)) { @@ -149,23 +148,16 @@ signal_handler (int signo) } break; } + + return G_SOURCE_CONTINUE; } static void initialize_signal_handler (void) { #ifndef G_OS_WIN32 - struct sigaction act; - sigset_t empty_mask; - - sigemptyset (&empty_mask); - act.sa_handler = signal_handler; - act.sa_mask = empty_mask; - act.sa_flags = 0; - - sigaction (SIGTERM, &act, NULL); - sigaction (SIGINT, &act, NULL); - sigaction (SIGHUP, &act, NULL); + g_unix_signal_add (SIGTERM, signal_handler, GINT_TO_POINTER (SIGTERM)); + g_unix_signal_add (SIGINT, signal_handler, GINT_TO_POINTER (SIGINT)); #endif /* G_OS_WIN32 */ } diff --git a/src/miners/user-guides/tracker-main.c b/src/miners/user-guides/tracker-main.c index b59622505..55920d9d4 100644 --- a/src/miners/user-guides/tracker-main.c +++ b/src/miners/user-guides/tracker-main.c @@ -21,10 +21,10 @@ #include <stdlib.h> #include <locale.h> -#include <signal.h> #include <errno.h> #include <glib.h> +#include <glib-unix.h> #include <glib-object.h> #include <glib/gi18n.h> @@ -67,9 +67,11 @@ static GOptionEntry entries[] = { { NULL } }; -static void -signal_handler (int signo) +static gboolean +signal_handler (gpointer user_data) { + int signo = GPOINTER_TO_INT (user_data); + static gboolean in_loop = FALSE; /* Die if we get re-entrant signals handler calls */ @@ -81,11 +83,8 @@ signal_handler (int signo) case SIGTERM: case SIGINT: in_loop = TRUE; - if (main_loop != NULL) { - g_main_loop_quit (main_loop); - } else { - exit (0); - } + g_main_loop_quit (main_loop); + /* Fall through */ default: if (g_strsignal (signo)) { @@ -96,23 +95,16 @@ signal_handler (int signo) } break; } + + return G_SOURCE_CONTINUE; } static void initialize_signal_handler (void) { #ifndef G_OS_WIN32 - struct sigaction act; - sigset_t empty_mask; - - sigemptyset (&empty_mask); - act.sa_handler = signal_handler; - act.sa_mask = empty_mask; - act.sa_flags = 0; - - sigaction (SIGTERM, &act, NULL); - sigaction (SIGINT, &act, NULL); - sigaction (SIGHUP, &act, NULL); + g_unix_signal_add (SIGTERM, signal_handler, GINT_TO_POINTER (SIGTERM)); + g_unix_signal_add (SIGINT, signal_handler, GINT_TO_POINTER (SIGINT)); #endif /* G_OS_WIN32 */ } diff --git a/src/tracker-extract/tracker-main.c b/src/tracker-extract/tracker-main.c index 22af4b288..a02cb0e8e 100644 --- a/src/tracker-extract/tracker-main.c +++ b/src/tracker-extract/tracker-main.c @@ -24,12 +24,12 @@ #include <time.h> #include <stdlib.h> #include <locale.h> -#include <signal.h> #include <errno.h> #include <sys/types.h> #include <unistd.h> #include <glib-object.h> +#include <glib-unix.h> #include <glib/gi18n.h> #include <glib/gprintf.h> #include <gio/gio.h> @@ -150,9 +150,11 @@ initialize_directories (void) g_free (user_data_dir); } -static void -signal_handler (int signo) +static gboolean +signal_handler (gpointer user_data) { + int signo = GPOINTER_TO_INT (user_data); + static gboolean in_loop = FALSE; /* Die if we get re-entrant signals handler calls */ @@ -176,23 +178,16 @@ signal_handler (int signo) } break; } + + return G_SOURCE_CONTINUE; } static void initialize_signal_handler (void) { #ifndef G_OS_WIN32 - struct sigaction act; - sigset_t empty_mask; - - sigemptyset (&empty_mask); - act.sa_handler = signal_handler; - act.sa_mask = empty_mask; - act.sa_flags = 0; - - sigaction (SIGTERM, &act, NULL); - sigaction (SIGINT, &act, NULL); - sigaction (SIGHUP, &act, NULL); + g_unix_signal_add (SIGTERM, signal_handler, GINT_TO_POINTER (SIGTERM)); + g_unix_signal_add (SIGINT, signal_handler, GINT_TO_POINTER (SIGINT)); #endif /* G_OS_WIN32 */ } @@ -385,10 +380,11 @@ main (int argc, char *argv[]) controller = tracker_extract_controller_new (decorator); tracker_miner_start (TRACKER_MINER (decorator)); - initialize_signal_handler (); - /* Main loop */ main_loop = g_main_loop_new (NULL, FALSE); + + initialize_signal_handler (); + g_main_loop_run (main_loop); my_main_loop = main_loop; diff --git a/src/tracker-store/tracker-main.vala b/src/tracker-store/tracker-main.vala index 8d991c6eb..468586710 100644 --- a/src/tracker-store/tracker-main.vala +++ b/src/tracker-store/tracker-main.vala @@ -77,7 +77,7 @@ License which can be viewed at: static bool in_loop = false; - static void signal_handler (int signo) { + static bool signal_handler (int signo) { /* Die if we get re-entrant signals handler calls */ if (in_loop) { Process.exit (1); @@ -101,20 +101,13 @@ License which can be viewed at: } break; } + + return true; } static void initialize_signal_handler () { - var empty_mask = Posix.sigset_t (); - Posix.sigemptyset (empty_mask); - - var act = Posix.sigaction_t (); - act.sa_handler = signal_handler; - act.sa_mask = empty_mask; - act.sa_flags = 0; - - Posix.sigaction (Posix.SIGTERM, act, null); - Posix.sigaction (Posix.SIGINT, act, null); - Posix.sigaction (Posix.SIGHUP, act, null); + Unix.signal_add (Posix.SIGTERM, () => signal_handler (Posix.SIGTERM)); + Unix.signal_add (Posix.SIGINT, () => signal_handler (Posix.SIGINT)); } static void initialize_priority () { @@ -298,9 +291,10 @@ License which can be viewed at: * doing what they do and shutdown. */ if (!shutdown) { + main_loop = new MainLoop (); + initialize_signal_handler (); - main_loop = new MainLoop (); main_loop.run (); } diff --git a/src/tracker/tracker-daemon.c b/src/tracker/tracker-daemon.c index f37f1a166..7cda3e3bb 100644 --- a/src/tracker/tracker-daemon.c +++ b/src/tracker/tracker-daemon.c @@ -27,6 +27,7 @@ #endif #include <glib.h> +#include <glib-unix.h> #include <glib/gi18n.h> #include <glib/gprintf.h> @@ -206,9 +207,11 @@ parse_watch (const gchar *option_name, return TRUE; } -static void -signal_handler (int signo) +static gboolean +signal_handler (gpointer user_data) { + int signo = GPOINTER_TO_INT (user_data); + static gboolean in_loop = FALSE; /* Die if we get re-entrant signals handler calls */ @@ -232,22 +235,15 @@ signal_handler (int signo) } break; } + + return G_SOURCE_CONTINUE; } static void initialize_signal_handler (void) { - struct sigaction act; - sigset_t empty_mask; - - sigemptyset (&empty_mask); - act.sa_handler = signal_handler; - act.sa_mask = empty_mask; - act.sa_flags = 0; - - sigaction (SIGTERM, &act, NULL); - sigaction (SIGINT, &act, NULL); - sigaction (SIGHUP, &act, NULL); + g_unix_signal_add (SIGTERM, signal_handler, GINT_TO_POINTER (SIGTERM)); + g_unix_signal_add (SIGINT, signal_handler, GINT_TO_POINTER (SIGINT)); } static gboolean |