[Spice-devel] [spice-gtk v1 2/6] spice-channel: add internal spice_channel_set_state()
Victor Toso
victortoso at redhat.com
Tue Sep 24 09:14:58 UTC 2019
From: Victor Toso <me at victortoso.com>
So we can easily track channel's state changes instead of doing so by
accessing its Private structure. Some more checking on the state
machine can be later added as well.
Signed-off-by: Victor Toso <victortoso at redhat.com>
---
src/channel-main.c | 8 ++++----
src/spice-channel-priv.h | 1 +
src/spice-channel.c | 37 +++++++++++++++++++++++++++++++++++++
src/spice-session.c | 4 ++--
4 files changed, 44 insertions(+), 6 deletions(-)
diff --git a/src/channel-main.c b/src/channel-main.c
index ac0d408..a0ab520 100644
--- a/src/channel-main.c
+++ b/src/channel-main.c
@@ -2215,11 +2215,11 @@ static void migrate_channel_event_cb(SpiceChannel *channel, SpiceChannelEvent ev
if (mig->do_seamless) {
SpiceMainChannelPrivate *main_priv = SPICE_MAIN_CHANNEL(channel)->priv;
- c->state = SPICE_CHANNEL_STATE_MIGRATION_HANDSHAKE;
+ spice_channel_set_state(channel, SPICE_CHANNEL_STATE_MIGRATION_HANDSHAKE);
mig->dst_channel = channel;
main_priv->migrate_data = mig;
} else {
- c->state = SPICE_CHANNEL_STATE_MIGRATING;
+ spice_channel_set_state(channel, SPICE_CHANNEL_STATE_MIGRATING);
mig->nchannels--;
}
/* now connect the rest of the channels */
@@ -2238,7 +2238,7 @@ static void migrate_channel_event_cb(SpiceChannel *channel, SpiceChannelEvent ev
}
g_list_free(channels);
} else {
- c->state = SPICE_CHANNEL_STATE_MIGRATING;
+ spice_channel_set_state(channel, SPICE_CHANNEL_STATE_MIGRATING);
mig->nchannels--;
}
@@ -2262,7 +2262,7 @@ static gboolean main_migrate_handshake_done(gpointer data)
g_return_val_if_fail(spice_channel_get_channel_type(channel) == SPICE_CHANNEL_MAIN, FALSE);
g_return_val_if_fail(spice_channel_get_state(channel) == SPICE_CHANNEL_STATE_MIGRATION_HANDSHAKE, FALSE);
- c->state = SPICE_CHANNEL_STATE_MIGRATING;
+ spice_channel_set_state(channel, SPICE_CHANNEL_STATE_MIGRATING);
mig->nchannels--;
if (mig->nchannels == 0)
coroutine_yieldto(mig->from, NULL);
diff --git a/src/spice-channel-priv.h b/src/spice-channel-priv.h
index 80ea714..4f893dd 100644
--- a/src/spice-channel-priv.h
+++ b/src/spice-channel-priv.h
@@ -171,6 +171,7 @@ void spice_channel_up(SpiceChannel *channel);
void spice_channel_wakeup(SpiceChannel *channel, gboolean cancel);
SpiceSession* spice_channel_get_session(SpiceChannel *channel);
+void spice_channel_set_state(SpiceChannel *channel, gint state);
enum spice_channel_state spice_channel_get_state(SpiceChannel *channel);
guint64 spice_channel_get_queue_size (SpiceChannel *channel);
diff --git a/src/spice-channel.c b/src/spice-channel.c
index 315e287..26fa671 100644
--- a/src/spice-channel.c
+++ b/src/spice-channel.c
@@ -3009,6 +3009,43 @@ SpiceSession* spice_channel_get_session(SpiceChannel *channel)
return channel->priv->session;
}
+static const char *
+channel_state_to_string(gint state)
+{
+ switch(state) {
+ case SPICE_CHANNEL_STATE_UNCONNECTED:
+ return "unconnected";
+ case SPICE_CHANNEL_STATE_RECONNECTING:
+ return "reconnecting";
+ case SPICE_CHANNEL_STATE_CONNECTING:
+ return "connecting";
+ case SPICE_CHANNEL_STATE_READY:
+ return "ready";
+ case SPICE_CHANNEL_STATE_SWITCHING:
+ return "switching";
+ case SPICE_CHANNEL_STATE_MIGRATING:
+ return "migrating";
+ case SPICE_CHANNEL_STATE_MIGRATION_HANDSHAKE:
+ return "migration handshake";
+ default:
+ g_warn_if_reached();
+ }
+ return "????";
+}
+
+G_GNUC_INTERNAL
+void spice_channel_set_state(SpiceChannel *channel, gint state)
+{
+ g_return_if_fail(SPICE_IS_CHANNEL(channel));
+ g_return_if_fail(state >= SPICE_CHANNEL_STATE_UNCONNECTED &&
+ state <= SPICE_CHANNEL_STATE_MIGRATION_HANDSHAKE);
+
+ CHANNEL_DEBUG(channel, "state changing from %s -> %s",
+ channel_state_to_string(channel->priv->state),
+ channel_state_to_string(state));
+ channel->priv->state = state;
+}
+
G_GNUC_INTERNAL
enum spice_channel_state spice_channel_get_state(SpiceChannel *channel)
{
diff --git a/src/spice-session.c b/src/spice-session.c
index afeb724..a770c92 100644
--- a/src/spice-session.c
+++ b/src/spice-session.c
@@ -1889,7 +1889,7 @@ static gboolean after_main_init(gpointer data)
l = l->next;
spice_session_channel_migrate(self, channel);
- channel->priv->state = SPICE_CHANNEL_STATE_READY;
+ spice_channel_set_state(channel, SPICE_CHANNEL_STATE_READY);
spice_channel_up(channel);
}
@@ -1937,7 +1937,7 @@ void spice_session_migrate_end(SpiceSession *self)
if (!SPICE_IS_MAIN_CHANNEL(channel)) {
/* freeze other channels */
- channel->priv->state = SPICE_CHANNEL_STATE_MIGRATING;
+ spice_channel_set_state(channel, SPICE_CHANNEL_STATE_MIGRATING);
}
/* reset for migration, disconnect */
--
2.21.0
More information about the Spice-devel
mailing list