[Spice-devel] [PATCH spice-server v3 2/3] Improve MainChannel encapsulation

Frediano Ziglio fziglio at redhat.com
Mon Oct 17 10:55:08 UTC 2016


> 
> From: Jonathon Jongsma <jjongsma at redhat.com>
> 
> Encapsulate MainChannel a bit better in preparation for proting to
> GObject.
> ---
>  server/main-channel-client.c | 24 +++++++++++-------------
>  server/main-channel.c        | 15 +++++++++++++++
>  server/main-channel.h        |  2 ++
>  3 files changed, 28 insertions(+), 13 deletions(-)
> 
> diff --git a/server/main-channel-client.c b/server/main-channel-client.c
> index 0913028..28d2839 100644
> --- a/server/main-channel-client.c
> +++ b/server/main-channel-client.c
> @@ -439,11 +439,7 @@ void
> main_channel_client_handle_migrate_connected(MainChannelClient *mcc,
>  
>          mcc->priv->mig_wait_connect = FALSE;
>          mcc->priv->mig_connect_ok = success;
> -        spice_assert(main_channel->num_clients_mig_wait);
> -        spice_assert(!seamless || main_channel->num_clients_mig_wait == 1);
> -        if (!--main_channel->num_clients_mig_wait) {
> -            reds_on_main_migrate_connected(channel->reds, seamless &&
> success);
> -        }
> +        main_channel_on_migrate_connected(main_channel, seamless &&
> success);
>      } else {
>          if (success) {
>              spice_printerr("client %p MIGRATE_CANCEL", client);
> @@ -876,7 +872,7 @@ static void main_channel_marshall_notify(RedChannelClient
> *rcc,
>  static void main_channel_fill_migrate_dst_info(MainChannel *main_channel,
>                                                 SpiceMigrationDstInfo
>                                                 *dst_info)
>  {
> -    RedsMigSpice *mig_dst = &main_channel->mig_target;
> +    const RedsMigSpice *mig_dst =
> main_channel_peek_migration_target(main_channel);
>      dst_info->port = mig_dst->port;
>      dst_info->sport = mig_dst->sport;
>      dst_info->host_size = strlen(mig_dst->host) + 1;
> @@ -935,17 +931,19 @@ static void
> main_channel_marshall_migrate_switch(SpiceMarshaller *m, RedChannelC
>      RedChannel *channel = red_channel_client_get_channel(rcc);
>      SpiceMsgMainMigrationSwitchHost migrate;
>      MainChannel *main_ch;
> +    const RedsMigSpice *mig_target;
>  
>      spice_printerr("");
>      red_channel_client_init_send_data(rcc,
>      SPICE_MSG_MAIN_MIGRATE_SWITCH_HOST, item);
>      main_ch = SPICE_CONTAINEROF(channel, MainChannel, base);
> -    migrate.port = main_ch->mig_target.port;
> -    migrate.sport = main_ch->mig_target.sport;
> -    migrate.host_size = strlen(main_ch->mig_target.host) + 1;
> -    migrate.host_data = (uint8_t *)main_ch->mig_target.host;
> -    if (main_ch->mig_target.cert_subject) {
> -        migrate.cert_subject_size = strlen(main_ch->mig_target.cert_subject)
> + 1;
> -        migrate.cert_subject_data = (uint8_t
> *)main_ch->mig_target.cert_subject;
> +    mig_target = main_channel_peek_migration_target(main_ch);
> +    migrate.port = mig_target->port;
> +    migrate.sport = mig_target->sport;
> +    migrate.host_size = strlen(mig_target->host) + 1;
> +    migrate.host_data = (uint8_t *)mig_target->host;
> +    if (mig_target->cert_subject) {
> +        migrate.cert_subject_size = strlen(mig_target->cert_subject) + 1;
> +        migrate.cert_subject_data = (uint8_t *)mig_target->cert_subject;
>      } else {
>          migrate.cert_subject_size = 0;
>          migrate.cert_subject_data = NULL;
> diff --git a/server/main-channel.c b/server/main-channel.c
> index a1b8e31..2d2783d 100644
> --- a/server/main-channel.c
> +++ b/server/main-channel.c
> @@ -419,3 +419,18 @@ int main_channel_migrate_src_complete(MainChannel
> *main_chan, int success)
>     }
>     return semi_seamless_count;
>  }
> +
> +void main_channel_on_migrate_connected(MainChannel *main_channel, gboolean
> seamless)
> +{
> +        g_return_if_fail(main_channel->num_clients_mig_wait);
> +        g_warn_if_fail(!seamless || main_channel->num_clients_mig_wait ==
> 1);

I just realized that beside spice_assert replacement this test is different.
Not seamless is the old "seamless && success" condition so this is equivalent
to 

g_warn_if_fail(!(seamless && success) || main_channel->num_clients_mig_wait == 1);

which is

g_warn_if_fail(!seamless || !success || main_channel->num_clients_mig_wait == 1);

we should probably pass seamless and success.

Perhaps would be more easier to define a new enum like

enum {
    MIG_CONNECT_STANDARD,
    MIG_CONNECT_SEAMLESS,
    MIG_CONNECT_ERROR
};

that group success and seamless.

Still convinced that changing spice_assert has nothing to do which
this patch rationale.

> +        if (!--main_channel->num_clients_mig_wait) {
> +
> reds_on_main_migrate_connected(red_channel_get_server(RED_CHANNEL(main_channel)),
> +                                           seamless);
> +        }
> +}
> +
> +const RedsMigSpice* main_channel_peek_migration_target(MainChannel
> *main_chan)
> +{
> +    return &main_chan->mig_target;
> +}
> diff --git a/server/main-channel.h b/server/main-channel.h
> index e0858d0..529e7be 100644
> --- a/server/main-channel.h
> +++ b/server/main-channel.h
> @@ -78,7 +78,9 @@ void main_channel_migrate_switch(MainChannel *main_chan,
> RedsMigSpice *mig_targe
>  int main_channel_migrate_connect(MainChannel *main_channel, RedsMigSpice
>  *mig_target,
>                                   int try_seamless);
>  void main_channel_migrate_cancel_wait(MainChannel *main_chan);
> +const RedsMigSpice* main_channel_peek_migration_target(MainChannel
> *main_chan);
>  /* returns the number of clients for which SPICE_MSG_MAIN_MIGRATE_END was
>  sent*/
>  int main_channel_migrate_src_complete(MainChannel *main_chan, int success);
> +void main_channel_on_migrate_connected(MainChannel *main_channel, gboolean
> seamless);
>  
>  #endif

Frediano


More information about the Spice-devel mailing list