Sophie

Sophie

distrib > Fedora > 18 > i386 > by-pkgid > 985e0d6624670bb7ae8f98c1228ff488 > files > 9

gnome-session-3.6.2-4.fc18.src.rpm

From f2bee2cb89056d597d5815a1c403466234093a7d Mon Sep 17 00:00:00 2001
From: Daniel Drake <dsd@laptop.org>
Date: Mon, 12 Nov 2012 15:29:13 -0600
Subject: [PATCH] Reject new XSMP clients earlier in the shutdown path

When we are ending the session, a new client connecting and trying to
register causes things to get confused and long delays to happen.

Move GsmXsmpServer to be managed by GsmManager, which can now tell the
server at a much earlier time when we are shutting down. Now new clients
are rejected much earlier and the confusion and delays are gone.

https://bugzilla.gnome.org/show_bug.cgi?id=688209
---
 gnome-session/gsm-manager.c     | 11 +++++++++++
 gnome-session/gsm-xsmp-server.c | 13 ++++++++++---
 gnome-session/gsm-xsmp-server.h |  1 +
 gnome-session/main.c            |  6 ------
 4 files changed, 22 insertions(+), 9 deletions(-)

Index: gnome-session-3.6.2/gnome-session/gsm-manager.c
===================================================================
--- gnome-session-3.6.2.orig/gnome-session/gsm-manager.c
+++ gnome-session-3.6.2/gnome-session/gsm-manager.c
@@ -48,6 +48,7 @@
 #include "gsm-presence.h"
 #include "gsm-shell.h"
 
+#include "gsm-xsmp-server.h"
 #include "gsm-xsmp-client.h"
 #include "gsm-dbus-client.h"
 
@@ -118,6 +119,7 @@ struct GsmManagerPrivate
         GsmStore               *inhibitors;
         GsmStore               *apps;
         GsmPresence            *presence;
+        GsmXsmpServer          *xsmp_server;
 
         char                   *session_name;
         gboolean                is_fallback_session : 1;
@@ -1584,6 +1586,7 @@ start_phase (GsmManager *manager)
                 update_idle (manager);
                 break;
         case GSM_MANAGER_PHASE_QUERY_END_SESSION:
+                gsm_xsmp_server_stop_accepting_new_clients (manager->priv->xsmp_server);
                 do_phase_query_end_session (manager);
                 break;
         case GSM_MANAGER_PHASE_END_SESSION:
@@ -1641,6 +1644,7 @@ gsm_manager_start (GsmManager *manager)
 
         g_return_if_fail (GSM_IS_MANAGER (manager));
 
+        gsm_xsmp_server_start (manager->priv->xsmp_server);
         gsm_manager_set_phase (manager, GSM_MANAGER_PHASE_INITIALIZATION);
         debug_app_summary (manager);
         start_phase (manager);
@@ -2380,6 +2384,11 @@ gsm_manager_set_client_store (GsmManager
         manager->priv->clients = store;
 
         if (manager->priv->clients != NULL) {
+                if (manager->priv->xsmp_server)
+                        g_object_unref (manager->priv->xsmp_server);
+
+                manager->priv->xsmp_server = gsm_xsmp_server_new (store);
+
                 g_signal_connect (manager->priv->clients,
                                   "added",
                                   G_CALLBACK (on_store_client_added),
@@ -2504,6 +2513,8 @@ gsm_manager_dispose (GObject *object)
 
         g_debug ("GsmManager: disposing manager");
 
+        g_clear_object (&manager->priv->xsmp_server);
+
         if (manager->priv->clients != NULL) {
                 g_signal_handlers_disconnect_by_func (manager->priv->clients,
                                                       on_store_client_added,
Index: gnome-session-3.6.2/gnome-session/gsm-xsmp-server.c
===================================================================
--- gnome-session-3.6.2.orig/gnome-session/gsm-xsmp-server.c
+++ gnome-session-3.6.2/gnome-session/gsm-xsmp-server.c
@@ -71,7 +71,7 @@ struct GsmXsmpServerPrivate
         IceListenObj   *xsmp_sockets;
         int             num_xsmp_sockets;
         int             num_local_xsmp_sockets;
-
+        gboolean        stopping;
 };
 
 enum {
@@ -248,6 +248,14 @@ gsm_xsmp_server_start (GsmXsmpServer *se
         }
 }
 
+void
+gsm_xsmp_server_stop_accepting_new_clients (GsmXsmpServer *server)
+{
+        g_return_if_fail (GSM_IS_XSMP_SERVER (server));
+        g_debug ("gsm_xsmp_server_stop");
+        server->priv->stopping = TRUE;
+}
+
 static void
 gsm_xsmp_server_set_client_store (GsmXsmpServer *xsmp_server,
                                   GsmStore      *store)
@@ -319,8 +327,7 @@ accept_xsmp_connection (SmsConn        s
         GsmClient             *client;
         GsmIceConnectionWatch *data;
 
-        /* FIXME: what about during shutdown but before gsm_xsmp_shutdown? */
-        if (server->priv->xsmp_sockets == NULL) {
+        if (server->priv->stopping) {
                 g_debug ("GsmXsmpServer: In shutdown, rejecting new client");
 
                 *failure_reason_ret = strdup (_("Refusing new client connection because the session is currently being shut down\n"));
Index: gnome-session-3.6.2/gnome-session/gsm-xsmp-server.h
===================================================================
--- gnome-session-3.6.2.orig/gnome-session/gsm-xsmp-server.h
+++ gnome-session-3.6.2/gnome-session/gsm-xsmp-server.h
@@ -52,6 +52,7 @@ GType               gsm_xsmp_server_get_
 
 GsmXsmpServer *     gsm_xsmp_server_new                            (GsmStore      *client_store);
 void                gsm_xsmp_server_start                          (GsmXsmpServer *server);
+void                gsm_xsmp_server_stop_accepting_new_clients     (GsmXsmpServer *server);
 
 G_END_DECLS
 
Index: gnome-session-3.6.2/gnome-session/main.c
===================================================================
--- gnome-session-3.6.2.orig/gnome-session/main.c
+++ gnome-session-3.6.2/gnome-session/main.c
@@ -45,7 +45,6 @@
 #include "gsm-session-fill.h"
 #include "gsm-store.h"
 #include "gsm-system.h"
-#include "gsm-xsmp-server.h"
 #include "gsm-fail-whale-dialog.h"
 
 #define GSM_DBUS_NAME "org.gnome.SessionManager"
@@ -283,7 +282,6 @@ main (int argc, char **argv)
         char             *display_str;
         GsmManager       *manager;
         GsmStore         *client_store;
-        GsmXsmpServer    *xsmp_server;
         GdmSignalHandler *signal_handler;
         static char     **override_autostart_dirs = NULL;
         static char      *session_name = NULL;
@@ -357,8 +355,6 @@ main (int argc, char **argv)
          */
         g_object_unref (gsm_get_system ());
 
-        xsmp_server = gsm_xsmp_server_new (client_store);
-
         if (!acquire_name ()) {
                 gsm_fail_whale_dialog_we_failed (TRUE, TRUE, NULL);
                 gtk_main ();
@@ -385,15 +381,10 @@ main (int argc, char **argv)
                 gsm_util_init_error (TRUE, "Failed to load session \"%s\"", session_name ? session_name : "(null)");
         }
 
-        gsm_xsmp_server_start (xsmp_server);
         gsm_manager_start (manager);
 
         gtk_main ();
 
-        if (xsmp_server != NULL) {
-                g_object_unref (xsmp_server);
-        }
-
         if (manager != NULL) {
                 g_debug ("Unreffing manager");
                 g_object_unref (manager);