[gnome-remote-desktop] Cleanup server stopping
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-remote-desktop] Cleanup server stopping
- Date: Fri, 25 Feb 2022 20:19:20 +0000 (UTC)
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]