[Spice-devel] [spice-server] playback: Don't lose client connection after migration
Christophe Fergeau
cfergeau at redhat.com
Fri Apr 14 07:02:26 UTC 2017
Commit 590acf3c556 introduced a regression after migration:
PlaybackChannel::connection is never set even if a client is connected,
which means the playback channel is non-functional until a client
reconnects as all the snd_channel_set_xxx() method checks for a non-NULL
PlaybackChannel::connection before sending data to the client.
This commit slightly changes the code flow in
on_new_playback_channel_client()/playback_channel_client_constructed()
so that PlaybackChannel::connection is set regardless of what
red_client_during_migrate_at_target() returns. This is what was done
prior to 590acf3c556.
This resolves https://bugs.freedesktop.org/show_bug.cgi?id=100136
Signed-off-by: Christophe Fergeau <cfergeau at redhat.com>
---
server/sound.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/server/sound.c b/server/sound.c
index 6a6d965..b50f9fc 100644
--- a/server/sound.c
+++ b/server/sound.c
@@ -991,10 +991,14 @@ static int snd_desired_audio_mode(bool playback_compression, int frequency,
static void on_new_playback_channel_client(SndChannel *channel, SndChannelClient *client)
{
RedsState *reds = red_channel_get_server(RED_CHANNEL(channel));
+ RedClient *red_client = red_channel_client_get_client(RED_CHANNEL_CLIENT(client));
spice_assert(client);
channel->connection = client;
+ if (red_client_during_migrate_at_target(red_client)) {
+ return;
+ }
snd_set_command(client, SND_PLAYBACK_MODE_MASK);
if (client->active) {
snd_set_command(client, SND_CTRL_MASK);
@@ -1036,7 +1040,6 @@ playback_channel_client_constructed(GObject *object)
{
PlaybackChannelClient *playback_client = PLAYBACK_CHANNEL_CLIENT(object);
RedChannel *red_channel = red_channel_client_get_channel(RED_CHANNEL_CLIENT(playback_client));
- RedClient *client = red_channel_client_get_client(RED_CHANNEL_CLIENT(playback_client));
SndChannel *channel = SND_CHANNEL(red_channel);
G_OBJECT_CLASS(playback_channel_client_parent_class)->constructed(object);
@@ -1061,9 +1064,7 @@ playback_channel_client_constructed(GObject *object)
}
}
- if (!red_client_during_migrate_at_target(client)) {
- on_new_playback_channel_client(channel, SND_CHANNEL_CLIENT(playback_client));
- }
+ on_new_playback_channel_client(channel, SND_CHANNEL_CLIENT(playback_client));
if (channel->active) {
snd_playback_start(channel);
--
2.9.3
More information about the Spice-devel
mailing list