[Spice-devel] [PATCH spice-gtk 1/9] channel: emit close event when coroutine has finished

Marc-André Lureau marcandre.lureau at redhat.com
Mon Feb 16 09:02:22 PST 2015


Move signaling of closed channel after the coroutine has exited in
delayed_unref callback, similarly to error events, so it's easier to
schedule reconnect since coroutine has terminated.
---
 gtk/spice-channel.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/gtk/spice-channel.c b/gtk/spice-channel.c
index eec63b1..faaaafe 100644
--- a/gtk/spice-channel.c
+++ b/gtk/spice-channel.c
@@ -2177,6 +2177,7 @@ static gboolean spice_channel_delayed_unref(gpointer data)
 {
     SpiceChannel *channel = SPICE_CHANNEL(data);
     SpiceChannelPrivate *c = channel->priv;
+    gboolean was_ready = c->state == SPICE_CHANNEL_STATE_READY;
 
     g_return_val_if_fail(channel != NULL, FALSE);
     CHANNEL_DEBUG(channel, "Delayed unref channel %p", channel);
@@ -2190,6 +2191,9 @@ static gboolean spice_channel_delayed_unref(gpointer data)
         g_clear_error(&c->error);
     }
 
+    if (was_ready)
+        g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_CLOSED);
+
     g_object_unref(G_OBJECT(data));
 
     return FALSE;
@@ -2646,9 +2650,6 @@ static void channel_disconnect(SpiceChannel *channel)
 
     c->has_error = TRUE; /* break the loop */
 
-    if (c->state == SPICE_CHANNEL_STATE_READY)
-        g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_CLOSED);
-
     spice_channel_reset(channel, FALSE);
 
     g_return_if_fail(SPICE_IS_CHANNEL(channel));
-- 
2.1.0



More information about the Spice-devel mailing list