diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2012-02-28 15:40:08 +1100 |
---|---|---|
committer | Robert Ancell <robert.ancell@canonical.com> | 2012-02-28 15:40:08 +1100 |
commit | 1d1f307891899c489bb568c8391b6fad347fe954 (patch) | |
tree | 7094c3927ba7c42cce78d3c4212453aacd4ca5dc /src | |
parent | 0708d29996aba782160fb251c714c5adb1083d3a (diff) | |
download | lightdm-1d1f307891899c489bb568c8391b6fad347fe954.tar.gz |
Tweak the way sessions and display servers are stopped
Diffstat (limited to 'src')
-rw-r--r-- | src/display-server.c | 14 | ||||
-rw-r--r-- | src/display-server.h | 3 | ||||
-rw-r--r-- | src/display.c | 58 | ||||
-rw-r--r-- | src/session.c | 21 | ||||
-rw-r--r-- | src/session.h | 4 | ||||
-rw-r--r-- | src/xserver-local.c | 7 | ||||
-rw-r--r-- | src/xserver-xvnc.c | 7 |
7 files changed, 77 insertions, 37 deletions
diff --git a/src/display-server.c b/src/display-server.c index e92b0866..8b8eafaf 100644 --- a/src/display-server.c +++ b/src/display-server.c @@ -81,12 +81,25 @@ display_server_stop (DisplayServer *server) DISPLAY_SERVER_GET_CLASS (server)->stop (server); } +gboolean +display_server_get_is_stopped (DisplayServer *server) +{ + g_return_val_if_fail (server != NULL, TRUE); + return DISPLAY_SERVER_GET_CLASS (server)->get_is_stopped (server); +} + static void display_server_real_stop (DisplayServer *server) { g_signal_emit (server, signals[STOPPED], 0); } +static gboolean +display_server_real_get_is_stopped (DisplayServer *server) +{ + return TRUE; +} + static void display_server_init (DisplayServer *server) { @@ -99,6 +112,7 @@ display_server_class_init (DisplayServerClass *klass) { klass->start = display_server_real_start; klass->stop = display_server_real_stop; + klass->get_is_stopped = display_server_real_get_is_stopped; g_type_class_add_private (klass, sizeof (DisplayServerPrivate)); diff --git a/src/display-server.h b/src/display-server.h index ffe1e176..c18e14fa 100644 --- a/src/display-server.h +++ b/src/display-server.h @@ -38,6 +38,7 @@ typedef struct gboolean (*start)(DisplayServer *server); void (*stop)(DisplayServer *server); + gboolean (*get_is_stopped)(DisplayServer *server); } DisplayServerClass; GType display_server_get_type (void); @@ -54,6 +55,8 @@ gboolean display_server_start (DisplayServer *server); void display_server_stop (DisplayServer *server); +gboolean display_server_get_is_stopped (DisplayServer *server); + G_END_DECLS #endif /* _DISPLAY_SERVER_H_ */ diff --git a/src/display.c b/src/display.c index 215611fb..f572f3ba 100644 --- a/src/display.c +++ b/src/display.c @@ -21,7 +21,8 @@ #include "pam-session.h" #include "greeter.h" -enum { +enum +{ CREATE_SESSION, READY, SWITCH_TO_USER, @@ -236,20 +237,6 @@ get_guest_username (Display *display) } static void -check_stopped (Display *display) -{ - if (display->priv->stopping && - !display->priv->stopped && - display->priv->display_server == NULL && - display->priv->session == NULL) - { - display->priv->stopped = TRUE; - g_debug ("Display stopped"); - g_signal_emit (display, signals[STOPPED], 0); - } -} - -static void autologin_authentication_result_cb (PAMSession *authentication, int result, Display *display) { g_signal_handlers_disconnect_matched (authentication, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display); @@ -353,7 +340,7 @@ cleanup_after_session (Display *display) if (display->priv->stopping) { - check_stopped (display); + display_stop (display); return TRUE; } @@ -857,25 +844,40 @@ display_stop (Display *display) { g_return_if_fail (display != NULL); + if (display->priv->stopped) + return; + if (!display->priv->stopping) { g_debug ("Stopping display"); - display->priv->stopping = TRUE; + } - if (display->priv->display_server) - display_server_stop (display->priv->display_server); - if (display->priv->session) - { - if (session_stop (display->priv->session)) - { - g_object_unref (display->priv->session); - display->priv->session = NULL; - } - } + /* Stop the session first */ + if (display->priv->session) + { + session_stop (display->priv->session); + if (display->priv->session && !session_get_is_stopped (display->priv->session)) + return; + g_signal_handlers_disconnect_matched (display->priv->session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display); + g_object_unref (display->priv->session); + display->priv->session = NULL; + } + + /* Stop the display server after that */ + if (display->priv->display_server) + { + display_server_stop (display->priv->display_server); + if (display->priv->display_server && !display_server_get_is_stopped (display->priv->display_server)) + return; + g_signal_handlers_disconnect_matched (display->priv->display_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display); + g_object_unref (display->priv->display_server); + display->priv->display_server = NULL; } - check_stopped (display); + display->priv->stopped = TRUE; + g_debug ("Display stopped"); + g_signal_emit (display, signals[STOPPED], 0); } gboolean diff --git a/src/session.c b/src/session.c index d4b9eb36..033de599 100644 --- a/src/session.c +++ b/src/session.c @@ -339,18 +339,23 @@ session_unlock (Session *session) ck_unlock_session (session->priv->console_kit_cookie); } -gboolean +void session_stop (Session *session) { - g_return_val_if_fail (session != NULL, TRUE); - - if (!process_get_is_running (PROCESS (session))) - return TRUE; + g_return_if_fail (session != NULL); - SESSION_GET_CLASS (session)->cleanup (session); - process_signal (PROCESS (session), SIGTERM); + if (process_get_is_running (PROCESS (session))) + { + SESSION_GET_CLASS (session)->cleanup (session); + process_signal (PROCESS (session), SIGTERM); + } +} - return FALSE; +gboolean +session_get_is_stopped (Session *session) +{ + g_return_val_if_fail (session != NULL, TRUE); + return !process_get_is_running (PROCESS (session)); } static gboolean diff --git a/src/session.h b/src/session.h index e5892cc4..b9e11e7d 100644 --- a/src/session.h +++ b/src/session.h @@ -74,7 +74,9 @@ void session_lock (Session *session); void session_unlock (Session *session); -gboolean session_stop (Session *session); +void session_stop (Session *session); + +gboolean session_get_is_stopped (Session *session); G_END_DECLS diff --git a/src/xserver-local.c b/src/xserver-local.c index 40d8904d..a1e18c3f 100644 --- a/src/xserver-local.c +++ b/src/xserver-local.c @@ -514,6 +514,12 @@ xserver_local_stop (DisplayServer *server) process_stop (XSERVER_LOCAL (server)->priv->xserver_process); } +static gboolean +xserver_local_get_is_stopped (DisplayServer *server) +{ + return process_get_pid (XSERVER_LOCAL (server)->priv->xserver_process) == 0; +} + static void xserver_local_init (XServerLocal *server) { @@ -553,6 +559,7 @@ xserver_local_class_init (XServerLocalClass *klass) display_server_class->start = xserver_local_start; display_server_class->stop = xserver_local_stop; + display_server_class->get_is_stopped = xserver_local_get_is_stopped; object_class->finalize = xserver_local_finalize; g_type_class_add_private (klass, sizeof (XServerLocalPrivate)); diff --git a/src/xserver-xvnc.c b/src/xserver-xvnc.c index 6e867b3f..2c8ed933 100644 --- a/src/xserver-xvnc.c +++ b/src/xserver-xvnc.c @@ -290,6 +290,12 @@ xserver_xvnc_stop (DisplayServer *server) process_stop (XSERVER_XVNC (server)->priv->xserver_process); } +static gboolean +xserver_xvnc_get_is_stopped (DisplayServer *server) +{ + return process_get_pid (XSERVER_XVNC (server)->priv->xserver_process) == 0; +} + static void xserver_xvnc_init (XServerXVNC *server) { @@ -323,6 +329,7 @@ xserver_xvnc_class_init (XServerXVNCClass *klass) display_server_class->start = xserver_xvnc_start; display_server_class->stop = xserver_xvnc_stop; + display_server_class->get_is_stopped = xserver_xvnc_get_is_stopped; object_class->finalize = xserver_xvnc_finalize; g_type_class_add_private (klass, sizeof (XServerXVNCPrivate)); |