[gnome-remote-desktop] Cleanup server stopping



commit 51b9d246d4bf39bd2cbad2e3f1cf5d0b9f849c98
Author: Jonas Ådahl <jadahl gmail com>
Date:   Sat Jan 22 19:25:22 2022 +0100

    Cleanup server stopping
    
    Add a _stop() function to the backend servers that is called before
    releasing the reference held by the daemon. This function will make sure
    the reference held by the socket listening meaning we'll actually
    reliably end up cleaning running the dispose function.
    
    Since we now do this, fix the session closing code that was already
    there; it hasn't excercised, since the daemon closes all sessions prior
    to tear server down. With these fixed, the session closing done by the
    daemon can be replaced by just making sure sessions did close.

 src/grd-daemon.c     | 42 ++++++++++++++++++++++++++----------------
 src/grd-rdp-server.c | 35 ++++++++++++++---------------------
 src/grd-rdp-server.h |  2 ++
 src/grd-vnc-server.c | 36 +++++++++++++++---------------------
 src/grd-vnc-server.h |  2 ++
 5 files changed, 59 insertions(+), 58 deletions(-)
---
diff --git a/src/grd-daemon.c b/src/grd-daemon.c
index 69049ded..64fe5ed2 100644
--- a/src/grd-daemon.c
+++ b/src/grd-daemon.c
@@ -92,6 +92,17 @@ init_rdp_server (GrdDaemon *daemon)
 
   return result;
 }
+
+static void
+stop_rdp_server (GrdDaemon *daemon)
+{
+  if (!daemon->rdp_server)
+    return;
+
+  g_message ("Stopping RDP server");
+  grd_rdp_server_stop (daemon->rdp_server);
+  g_clear_object (&daemon->rdp_server);
+}
 #endif /* HAVE_RDP */
 
 #ifdef HAVE_VNC
@@ -109,6 +120,17 @@ init_vnc_server (GrdDaemon *daemon)
 
   return result;
 }
+
+static void
+stop_vnc_server (GrdDaemon *daemon)
+{
+  if (!daemon->vnc_server)
+    return;
+
+  g_message ("Stopping VNC server");
+  grd_vnc_server_stop (daemon->vnc_server);
+  g_clear_object (&daemon->vnc_server);
+}
 #endif /* HAVE_VNC */
 
 static void
@@ -134,29 +156,17 @@ maybe_enable_services (GrdDaemon *daemon)
     }
 }
 
-static void
-close_all_sessions (GrdDaemon *daemon)
-{
-  GList *l;
-
-  while ((l = grd_context_get_sessions (daemon->context)))
-    {
-      GrdSession *session = l->data;
-
-      grd_session_stop (session);
-    }
-}
-
 static void
 disable_services (GrdDaemon *daemon)
 {
-  close_all_sessions (daemon);
 #ifdef HAVE_RDP
-  g_clear_object (&daemon->rdp_server);
+  stop_rdp_server (daemon);
 #endif
 #ifdef HAVE_VNC
-  g_clear_object (&daemon->vnc_server);
+  stop_vnc_server (daemon);
 #endif
+
+  g_assert (!grd_context_get_sessions (daemon->context));
 }
 
 static void
diff --git a/src/grd-rdp-server.c b/src/grd-rdp-server.c
index 928a3faa..3d986377 100644
--- a/src/grd-rdp-server.c
+++ b/src/grd-rdp-server.c
@@ -48,7 +48,7 @@ struct _GrdRdpServer
   GList *sessions;
 
   GList *stopped_sessions;
-  guint idle_task;
+  guint cleanup_sessions_idle_id;
 
   GrdContext *context;
 #ifdef HAVE_HWACCEL_NVIDIA
@@ -107,7 +107,7 @@ static gboolean
 cleanup_stopped_sessions_idle (GrdRdpServer *rdp_server)
 {
   grd_rdp_server_cleanup_stopped_sessions (rdp_server);
-  rdp_server->idle_task = 0;
+  rdp_server->cleanup_sessions_idle_id = 0;
 
   return G_SOURCE_REMOVE;
 }
@@ -121,9 +121,9 @@ on_session_stopped (GrdSession   *session,
   rdp_server->stopped_sessions = g_list_append (rdp_server->stopped_sessions,
                                                 session);
   rdp_server->sessions = g_list_remove (rdp_server->sessions, session);
-  if (!rdp_server->idle_task)
+  if (!rdp_server->cleanup_sessions_idle_id)
     {
-      rdp_server->idle_task =
+      rdp_server->cleanup_sessions_idle_id =
         g_idle_add ((GSourceFunc) cleanup_stopped_sessions_idle,
                     rdp_server);
     }
@@ -172,11 +172,11 @@ grd_rdp_server_start (GrdRdpServer  *rdp_server,
   return TRUE;
 }
 
-static void
-stop_and_unref_session (GrdSession *session)
+void
+grd_rdp_server_stop (GrdRdpServer *rdp_server)
 {
-  grd_session_stop (session);
-  g_object_unref (session);
+  g_socket_service_stop (G_SOCKET_SERVICE (rdp_server));
+  g_socket_listener_close (G_SOCKET_LISTENER (rdp_server));
 }
 
 static void
@@ -221,23 +221,16 @@ grd_rdp_server_dispose (GObject *object)
 {
   GrdRdpServer *rdp_server = GRD_RDP_SERVER (object);
 
-  if (rdp_server->idle_task)
+  while (rdp_server->sessions)
     {
-      g_source_remove (rdp_server->idle_task);
-      rdp_server->idle_task = 0;
-    }
+      GrdSession *session = rdp_server->sessions->data;
 
-  if (rdp_server->stopped_sessions)
-    {
-      grd_rdp_server_cleanup_stopped_sessions (rdp_server);
-    }
-  if (rdp_server->sessions)
-    {
-      g_list_free_full (rdp_server->sessions,
-                        (GDestroyNotify) stop_and_unref_session);
-      rdp_server->sessions = NULL;
+      grd_session_stop (session);
     }
 
+  g_clear_handle_id (&rdp_server->cleanup_sessions_idle_id, g_source_remove);
+  grd_rdp_server_cleanup_stopped_sessions (rdp_server);
+
 #ifdef HAVE_HWACCEL_NVIDIA
   g_clear_object (&rdp_server->hwaccel_nvidia);
 #endif /* HAVE_HWACCEL_NVIDIA */
diff --git a/src/grd-rdp-server.h b/src/grd-rdp-server.h
index 2c011adf..8b3667a0 100644
--- a/src/grd-rdp-server.h
+++ b/src/grd-rdp-server.h
@@ -36,6 +36,8 @@ GrdContext *grd_rdp_server_get_context (GrdRdpServer *rdp_server);
 gboolean grd_rdp_server_start (GrdRdpServer  *rdp_server,
                                GError       **error);
 
+void grd_rdp_server_stop (GrdRdpServer *rdp_server);
+
 GrdRdpServer *grd_rdp_server_new (GrdContext *context);
 
 #endif /* GRD_RDP_SERVER_H */
diff --git a/src/grd-vnc-server.c b/src/grd-vnc-server.c
index aae10293..b2531079 100644
--- a/src/grd-vnc-server.c
+++ b/src/grd-vnc-server.c
@@ -45,7 +45,7 @@ struct _GrdVncServer
   GList *sessions;
 
   GList *stopped_sessions;
-  guint idle_task;
+  guint cleanup_sessions_idle_id;
 
   GrdContext *context;
 };
@@ -81,7 +81,7 @@ static gboolean
 cleanup_stopped_sessions_idle (GrdVncServer *vnc_server)
 {
   grd_vnc_server_cleanup_stopped_sessions (vnc_server);
-  vnc_server->idle_task = 0;
+  vnc_server->cleanup_sessions_idle_id = 0;
 
   return G_SOURCE_REMOVE;
 }
@@ -94,9 +94,9 @@ on_session_stopped (GrdSession *session, GrdVncServer *vnc_server)
   vnc_server->stopped_sessions = g_list_append (vnc_server->stopped_sessions,
                                                 session);
   vnc_server->sessions = g_list_remove (vnc_server->sessions, session);
-  if (!vnc_server->idle_task)
+  if (!vnc_server->cleanup_sessions_idle_id)
     {
-      vnc_server->idle_task =
+      vnc_server->cleanup_sessions_idle_id =
         g_idle_add ((GSourceFunc) cleanup_stopped_sessions_idle,
                     vnc_server);
     }
@@ -147,11 +147,11 @@ grd_vnc_server_start (GrdVncServer  *vnc_server,
   return TRUE;
 }
 
-static void
-stop_and_unref_session (GrdSession *session)
+void
+grd_vnc_server_stop (GrdVncServer *vnc_server)
 {
-  grd_session_stop (session);
-  g_object_unref (session);
+  g_socket_service_stop (G_SOCKET_SERVICE (vnc_server));
+  g_socket_listener_close (G_SOCKET_LISTENER (vnc_server));
 }
 
 static void
@@ -196,23 +196,17 @@ grd_vnc_server_dispose (GObject *object)
 {
   GrdVncServer *vnc_server = GRD_VNC_SERVER (object);
 
-  if (vnc_server->idle_task)
+  while (vnc_server->sessions)
     {
-      g_source_remove (vnc_server->idle_task);
-      vnc_server->idle_task = 0;
-    }
+      GrdSession *session = vnc_server->sessions->data;
 
-  if (vnc_server->stopped_sessions)
-    {
-      grd_vnc_server_cleanup_stopped_sessions (vnc_server);
-    }
-  if (vnc_server->sessions)
-    {
-      g_list_free_full (vnc_server->sessions,
-                        (GDestroyNotify) stop_and_unref_session);
-      vnc_server->sessions = NULL;
+      grd_session_stop (session);
     }
 
+  grd_vnc_server_cleanup_stopped_sessions (vnc_server);
+  g_clear_handle_id (&vnc_server->cleanup_sessions_idle_id,
+                     g_source_remove);
+
   G_OBJECT_CLASS (grd_vnc_server_parent_class)->dispose (object);
 }
 
diff --git a/src/grd-vnc-server.h b/src/grd-vnc-server.h
index 1e3a039f..bd5c8163 100644
--- a/src/grd-vnc-server.h
+++ b/src/grd-vnc-server.h
@@ -38,6 +38,8 @@ GrdContext *grd_vnc_server_get_context (GrdVncServer *vnc_server);
 
 gboolean grd_vnc_server_start (GrdVncServer *vnc_server, GError **error);
 
+void grd_vnc_server_stop (GrdVncServer *vnc_server);
+
 GrdVncServer *grd_vnc_server_new (GrdContext *context);
 
 #endif /* GRD_VNC_SERVER_H */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]