summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2012-02-28 15:40:08 +1100
committerRobert Ancell <robert.ancell@canonical.com>2012-02-28 15:40:08 +1100
commit1d1f307891899c489bb568c8391b6fad347fe954 (patch)
tree7094c3927ba7c42cce78d3c4212453aacd4ca5dc /src
parent0708d29996aba782160fb251c714c5adb1083d3a (diff)
downloadlightdm-1d1f307891899c489bb568c8391b6fad347fe954.tar.gz
Tweak the way sessions and display servers are stopped
Diffstat (limited to 'src')
-rw-r--r--src/display-server.c14
-rw-r--r--src/display-server.h3
-rw-r--r--src/display.c58
-rw-r--r--src/session.c21
-rw-r--r--src/session.h4
-rw-r--r--src/xserver-local.c7
-rw-r--r--src/xserver-xvnc.c7
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));