From f5d6584fa8d60ab78ec2307ab7a8787fb6895a91 Mon Sep 17 00:00:00 2001 From: William Jon McCann Date: Aug 15 2008 17:13:36 +0000 Subject: Use a callback for the fatal handler instead of supplying the main_loop. 2008-08-15 William Jon McCann * common/gdm-signal-handler.c (signal_io_watch), (gdm_signal_handler_set_fatal_func): * common/gdm-signal-handler.h: * daemon/factory-slave-main.c (main): * daemon/gdm-session-direct.c (stop_worker): * daemon/gdm-session-worker-job.c (session_worker_job_child_watch): * daemon/main.c (main): * daemon/product-slave-main.c (main): * daemon/session-worker-main.c (main): * daemon/simple-slave-main.c (main): * daemon/xdmcp-chooser-slave-main.c (main): Use a callback for the fatal handler instead of supplying the main_loop. svn path=/trunk/; revision=6382 --- diff --git a/ChangeLog b/ChangeLog index b4bdbca..6784c4d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2008-08-15 William Jon McCann + + * common/gdm-signal-handler.c (signal_io_watch), + (gdm_signal_handler_set_fatal_func): + * common/gdm-signal-handler.h: + * daemon/factory-slave-main.c (main): + * daemon/gdm-session-direct.c (stop_worker): + * daemon/gdm-session-worker-job.c (session_worker_job_child_watch): + * daemon/main.c (main): + * daemon/product-slave-main.c (main): + * daemon/session-worker-main.c (main): + * daemon/simple-slave-main.c (main): + * daemon/xdmcp-chooser-slave-main.c (main): + Use a callback for the fatal handler instead of supplying + the main_loop. + 2008-08-14 William Jon McCann * configure.ac: diff --git a/common/gdm-signal-handler.c b/common/gdm-signal-handler.c index c46df6f..b9362b3 100644 --- a/common/gdm-signal-handler.c +++ b/common/gdm-signal-handler.c @@ -50,11 +50,12 @@ typedef struct { struct GdmSignalHandlerPrivate { - GMainLoop *main_loop; - GHashTable *lookup; - GHashTable *id_lookup; - GHashTable *action_lookup; - guint next_id; + GHashTable *lookup; + GHashTable *id_lookup; + GHashTable *action_lookup; + guint next_id; + GDestroyNotify fatal_func; + gpointer fatal_data; }; static void gdm_signal_handler_class_init (GdmSignalHandlerClass *klass); @@ -140,10 +141,11 @@ signal_io_watch (GIOChannel *ioc, block_signals_pop (); if (is_fatal) { - g_debug ("GdmSignalHandler: Caught termination signal - exiting main loop"); - if (handler->priv->main_loop != NULL) { - g_main_loop_quit (handler->priv->main_loop); + if (handler->priv->fatal_func != NULL) { + g_debug ("GdmSignalHandler: Caught termination signal - calling fatal func"); + handler->priv->fatal_func (handler->priv->fatal_data); } else { + g_debug ("GdmSignalHandler: Caught termination signal - exiting"); exit (1); } @@ -456,13 +458,14 @@ signal_list_free (GSList *list) } void -gdm_signal_handler_set_main_loop (GdmSignalHandler *handler, - GMainLoop *main_loop) +gdm_signal_handler_set_fatal_func (GdmSignalHandler *handler, + GDestroyNotify func, + gpointer user_data) { g_return_if_fail (GDM_IS_SIGNAL_HANDLER (handler)); - /* FIXME: take a ref */ - handler->priv->main_loop = main_loop; + handler->priv->fatal_func = func; + handler->priv->fatal_data = user_data; } static void diff --git a/common/gdm-signal-handler.h b/common/gdm-signal-handler.h index 84ccbc6..20f1860 100644 --- a/common/gdm-signal-handler.h +++ b/common/gdm-signal-handler.h @@ -53,8 +53,9 @@ typedef struct GType gdm_signal_handler_get_type (void); GdmSignalHandler * gdm_signal_handler_new (void); -void gdm_signal_handler_set_main_loop (GdmSignalHandler *handler, - GMainLoop *main_loop); +void gdm_signal_handler_set_fatal_func (GdmSignalHandler *handler, + GDestroyNotify func, + gpointer user_data); void gdm_signal_handler_add_fatal (GdmSignalHandler *handler); guint gdm_signal_handler_add (GdmSignalHandler *handler, diff --git a/daemon/factory-slave-main.c b/daemon/factory-slave-main.c index 9bdc212..7f1ed7e 100644 --- a/daemon/factory-slave-main.c +++ b/daemon/factory-slave-main.c @@ -203,7 +203,9 @@ main (int argc, main_loop = g_main_loop_new (NULL, FALSE); signal_handler = gdm_signal_handler_new (); - gdm_signal_handler_set_main_loop (signal_handler, main_loop); + gdm_signal_handler_set_fatal_func (signal_handler, + (GDestroyNotify)g_main_loop_quit, + main_loop); 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); diff --git a/daemon/gdm-session-direct.c b/daemon/gdm-session-direct.c index 061e5b3..34a126f 100644 --- a/daemon/gdm-session-direct.c +++ b/daemon/gdm-session-direct.c @@ -1629,6 +1629,19 @@ start_worker (GdmSessionDirect *session) static void stop_worker (GdmSessionDirect *session) { + g_signal_handlers_disconnect_by_func (session->priv->job, + G_CALLBACK (worker_stopped), + session); + g_signal_handlers_disconnect_by_func (session->priv->job, + G_CALLBACK (worker_started), + session); + g_signal_handlers_disconnect_by_func (session->priv->job, + G_CALLBACK (worker_exited), + session); + g_signal_handlers_disconnect_by_func (session->priv->job, + G_CALLBACK (worker_died), + session); + cancel_pending_query (session); if (session->priv->worker_connection != NULL) { @@ -1637,6 +1650,7 @@ stop_worker (GdmSessionDirect *session) } gdm_session_worker_job_stop (session->priv->job); + g_object_unref (session->priv->job); session->priv->job = NULL; } diff --git a/daemon/gdm-session-worker-job.c b/daemon/gdm-session-worker-job.c index 01d8b35..bb30245 100644 --- a/daemon/gdm-session-worker-job.c +++ b/daemon/gdm-session-worker-job.c @@ -100,6 +100,10 @@ session_worker_job_child_watch (GPid pid, WIFEXITED (status) ? WEXITSTATUS (status) : WIFSIGNALED (status) ? WTERMSIG (status) : -1); + + g_spawn_close_pid (job->priv->pid); + job->priv->pid = -1; + if (WIFEXITED (status)) { int code = WEXITSTATUS (status); g_signal_emit (job, signals [EXITED], 0, code); @@ -107,9 +111,6 @@ session_worker_job_child_watch (GPid pid, int num = WTERMSIG (status); g_signal_emit (job, signals [DIED], 0, num); } - - g_spawn_close_pid (job->priv->pid); - job->priv->pid = -1; } static void diff --git a/daemon/main.c b/daemon/main.c index 3b884fe..9d7ab5e 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -620,7 +620,9 @@ main (int argc, main_loop = g_main_loop_new (NULL, FALSE); signal_handler = gdm_signal_handler_new (); - gdm_signal_handler_set_main_loop (signal_handler, main_loop); + gdm_signal_handler_set_fatal_func (signal_handler, + (GDestroyNotify)g_main_loop_quit, + 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); diff --git a/daemon/product-slave-main.c b/daemon/product-slave-main.c index 6282adf..f23a28b 100644 --- a/daemon/product-slave-main.c +++ b/daemon/product-slave-main.c @@ -207,7 +207,9 @@ main (int argc, main_loop = g_main_loop_new (NULL, FALSE); signal_handler = gdm_signal_handler_new (); - gdm_signal_handler_set_main_loop (signal_handler, main_loop); + gdm_signal_handler_set_fatal_func (signal_handler, + (GDestroyNotify)g_main_loop_quit, + main_loop); 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); diff --git a/daemon/session-worker-main.c b/daemon/session-worker-main.c index 68669d5..6709cbe 100644 --- a/daemon/session-worker-main.c +++ b/daemon/session-worker-main.c @@ -166,7 +166,9 @@ main (int argc, main_loop = g_main_loop_new (NULL, FALSE); signal_handler = gdm_signal_handler_new (); - gdm_signal_handler_set_main_loop (signal_handler, main_loop); + gdm_signal_handler_set_fatal_func (signal_handler, + (GDestroyNotify)g_main_loop_quit, + main_loop); 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); diff --git a/daemon/simple-slave-main.c b/daemon/simple-slave-main.c index 67e1bc3..9661fa7 100644 --- a/daemon/simple-slave-main.c +++ b/daemon/simple-slave-main.c @@ -217,7 +217,9 @@ main (int argc, main_loop = g_main_loop_new (NULL, FALSE); signal_handler = gdm_signal_handler_new (); - gdm_signal_handler_set_main_loop (signal_handler, main_loop); + gdm_signal_handler_set_fatal_func (signal_handler, + (GDestroyNotify)g_main_loop_quit, + main_loop); 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); diff --git a/daemon/xdmcp-chooser-slave-main.c b/daemon/xdmcp-chooser-slave-main.c index 29fdf22..94a97ee 100644 --- a/daemon/xdmcp-chooser-slave-main.c +++ b/daemon/xdmcp-chooser-slave-main.c @@ -209,7 +209,9 @@ main (int argc, main_loop = g_main_loop_new (NULL, FALSE); signal_handler = gdm_signal_handler_new (); - gdm_signal_handler_set_main_loop (signal_handler, main_loop); + gdm_signal_handler_set_fatal_func (signal_handler, + (GDestroyNotify)g_main_loop_quit, + main_loop); 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);