[Spice-devel] [spice-server] playback: Don't lose client connection after migration
Jonathon Jongsma
jjongsma at redhat.com
Tue Apr 18 21:38:12 UTC 2017
Acked-by: Jonathon Jongsma <jjongsma at redhat.com>
On Fri, 2017-04-14 at 09:02 +0200, Christophe Fergeau wrote:
> 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);
More information about the Spice-devel
mailing list