[PATCH spice-gtk 31/34] spicy: use SpiceSession::disconnected signal

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

 



From: Marc-André Lureau <marcandre.lureau@xxxxxxxxxx>

Let's not track channels ourself, but rely on the disconnected signal
instead.

This solves spicy hanging, when gstaudio is recording and the main
loop is gone, so record channel is not finalized, and GStreamer
locks.

Signed-off-by: Marc-André Lureau <marcandre.lureau@xxxxxxxxxx>
---
 tools/spicy.c | 17 ++++++-----------
 1 file changed, 6 insertions(+), 11 deletions(-)

diff --git a/tools/spicy.c b/tools/spicy.c
index 06af15e..8a6d077 100644
--- a/tools/spicy.c
+++ b/tools/spicy.c
@@ -100,7 +100,6 @@ struct spice_connection {
     const char       *mouse_state;
     const char       *agent_state;
     gboolean         agent_connected;
-    int              channels;
     int              disconnecting;
 
     /* key: SpiceFileTransferTask, value: TransferTaskWidgets */
@@ -111,7 +110,8 @@ struct spice_connection {
 static spice_connection *connection_new(void);
 static void connection_connect(spice_connection *conn);
 static void connection_disconnect(spice_connection *conn);
-static void connection_destroy(spice_connection *conn);
+static void connection_destroy(SpiceSession *session,
+                               spice_connection *conn);
 static void usb_connect_failed(GObject               *object,
                                SpiceUsbDevice        *device,
                                GError                *error,
@@ -1726,7 +1726,6 @@ static void channel_new(SpiceSession *s, SpiceChannel *channel, gpointer data)
     int id;
 
     g_object_get(channel, "channel-id", &id, NULL);
-    conn->channels++;
     SPICE_DEBUG("new channel (#%d)", id);
 
     if (SPICE_IS_MAIN_CHANNEL(channel)) {
@@ -1809,13 +1808,6 @@ static void channel_destroy(SpiceSession *s, SpiceChannel *channel, gpointer dat
         if (SPICE_PORT_CHANNEL(channel) == stdin_port)
             stdin_port = NULL;
     }
-
-    conn->channels--;
-    if (conn->channels > 0) {
-        return;
-    }
-
-    connection_destroy(conn);
 }
 
 static void migration_state(GObject *session,
@@ -1842,6 +1834,8 @@ static spice_connection *connection_new(void)
                      G_CALLBACK(channel_destroy), conn);
     g_signal_connect(conn->session, "notify::migration-state",
                      G_CALLBACK(migration_state), conn);
+    g_signal_connect(conn->session, "disconnected",
+                     G_CALLBACK(connection_destroy), conn);
 
     manager = spice_usb_device_manager_get(conn->session, NULL);
     if (manager) {
@@ -1873,7 +1867,8 @@ static void connection_disconnect(spice_connection *conn)
     spice_session_disconnect(conn->session);
 }
 
-static void connection_destroy(spice_connection *conn)
+static void connection_destroy(SpiceSession *session,
+                               spice_connection *conn)
 {
     g_object_unref(conn->session);
     g_hash_table_unref(conn->transfers);
-- 
2.20.1.2.gb21ebb671b

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux Virtualization]     [Linux Virtualization]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]