Updating branch refs/heads/master to 2a4edb8b1aad7e4cf4d3cbab3cffedd0f356fac5 (commit) from d154ab127af75a4e1e7b37351dd7e48491a4f69e (commit)
commit 2a4edb8b1aad7e4cf4d3cbab3cffedd0f356fac5 Author: Olivier Fourdan <four...@xfce.org> Date: Tue Oct 25 13:46:33 2011 +0200 Fix crash in signal handler src/main.c | 83 ++++++++++++++++++++++++++++++++++------------------------- 1 files changed, 48 insertions(+), 35 deletions(-) diff --git a/src/main.c b/src/main.c index 15eae37..47fd6b5 100644 --- a/src/main.c +++ b/src/main.c @@ -95,14 +95,59 @@ static DisplayInfo *main_display_info = NULL; static gint compositor = COMPOSITOR_MODE_MANUAL; static void +handleSignal (int sig) +{ + if (main_display_info) + { + switch (sig) + { + case SIGINT: + /* Walk thru */ + case SIGTERM: + gtk_main_quit (); + main_display_info->quit = TRUE; + break; + case SIGHUP: + /* Walk thru */ + case SIGUSR1: + main_display_info->reload = TRUE; + break; + default: + break; + } + } +} + +static void +setupHandler (gboolean install) +{ + struct sigaction act; + + if (install) + act.sa_handler = handleSignal; + else + act.sa_handler = SIG_DFL; + + sigemptyset (&act.sa_mask); + act.sa_flags = 0; + sigaction (SIGINT, &act, NULL); + sigaction (SIGTERM, &act, NULL); + sigaction (SIGHUP, &act, NULL); + sigaction (SIGUSR1, &act, NULL); + sigaction (SIGSEGV, &act, NULL); +} + +static void cleanUp (void) { GSList *screens; - g_return_if_fail (main_display_info); - TRACE ("entering cleanUp"); + setupHandler (FALSE); + + g_return_if_fail (main_display_info); + eventFilterClose (main_display_info->xfilter); for (screens = main_display_info->screens; screens; screens = g_slist_next (screens)) { @@ -120,31 +165,6 @@ cleanUp (void) } static void -handleSignal (int sig) -{ - TRACE ("entering handleSignal"); - - switch (sig) - { - case SIGINT: - case SIGTERM: - gtk_main_quit (); - main_display_info->quit = TRUE; - break; - case SIGHUP: - case SIGUSR1: - main_display_info->reload = TRUE; - break; - case SIGSEGV: - cleanUp (); - g_error (_("%s: Segmentation fault"), PACKAGE); - break; - default: - break; - } -} - -static void ensure_basedir_spec (void) { char *new, *old, path[PATH_MAX]; @@ -389,7 +409,6 @@ compositor_callback (const gchar *name, static int initialize (gint compositor_mode, gboolean replace_wm) { - struct sigaction act; gint i, nscreens; TRACE ("entering initialize"); @@ -422,13 +441,7 @@ initialize (gint compositor_mode, gboolean replace_wm) initModifiers (main_display_info->dpy); - act.sa_handler = handleSignal; - act.sa_flags = 0; - sigaction (SIGINT, &act, NULL); - sigaction (SIGTERM, &act, NULL); - sigaction (SIGHUP, &act, NULL); - sigaction (SIGUSR1, &act, NULL); - sigaction (SIGSEGV, &act, NULL); + setupHandler (TRUE); nscreens = gdk_display_get_n_screens (main_display_info->gdisplay); for(i = 0; i < nscreens; i++) _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits