[Spice-devel] [PATCH spice-gtk 08/13] migration: create the migration session earlier

Christophe Fergeau cfergeau at redhat.com
Wed Nov 12 08:30:03 PST 2014


ACK.

On Sun, Nov 09, 2014 at 05:31:40PM +0100, Marc-André Lureau wrote:
> The migration session creation may fail. Instead of delaying the session
> creation to the main_connect() callback, do it directly from the message
> handler context, to report failure early to server.
> ---
>  gtk/channel-main.c | 23 +++++++++++++++--------
>  1 file changed, 15 insertions(+), 8 deletions(-)
> 
> diff --git a/gtk/channel-main.c b/gtk/channel-main.c
> index 7cc7630..2b88391 100644
> --- a/gtk/channel-main.c
> +++ b/gtk/channel-main.c
> @@ -2065,21 +2065,16 @@ static gboolean migrate_connect(gpointer data)
>      SpiceChannelPrivate  *c;
>      int port, sport;
>      const char *host;
> -    SpiceSession *session;
>  
>      g_return_val_if_fail(mig != NULL, FALSE);
>      g_return_val_if_fail(mig->info != NULL, FALSE);
>      g_return_val_if_fail(mig->nchannels == 0, FALSE);
>      c = SPICE_CHANNEL(mig->src_channel)->priv;
>      g_return_val_if_fail(c != NULL, FALSE);
> +    g_return_val_if_fail(mig->session != NULL, FALSE);
>  
> -    session = spice_channel_get_session(mig->src_channel);
> -    g_return_val_if_fail(session->priv->migration == NULL, FALSE);
> -
> -    mig->session = spice_session_new_from_session(session);
>      mig->session->priv->migration_copy = true;
>      spice_session_set_migration_state(mig->session, SPICE_SESSION_MIGRATION_CONNECTING);
> -    session->priv->migration = g_object_ref(mig->session);
>  
>      if ((c->peer_hdr.major_version == 1) &&
>          (c->peer_hdr.minor_version < 1)) {
> @@ -2149,9 +2144,10 @@ static void main_migrate_connect(SpiceChannel *channel,
>                                   uint32_t src_mig_version)
>  {
>      SpiceMainChannelPrivate *main_priv = SPICE_MAIN_CHANNEL(channel)->priv;
> +    int reply_type = SPICE_MSGC_MAIN_MIGRATE_CONNECT_ERROR;
>      spice_migrate mig = { 0, };
>      SpiceMsgOut *out;
> -    int reply_type;
> +    SpiceSession *session;
>  
>      mig.src_channel = channel;
>      mig.info = dst_info;
> @@ -2159,6 +2155,16 @@ static void main_migrate_connect(SpiceChannel *channel,
>      mig.do_seamless = do_seamless;
>      mig.src_mig_version = src_mig_version;
>  
> +    CHANNEL_DEBUG(channel, "migrate connect");
> +    session = spice_channel_get_session(channel);
> +    if (session->priv->migration != NULL)
> +        goto end;
> +
> +    mig.session = spice_session_new_from_session(session);
> +    if (mig.session == NULL)
> +        goto end;
> +    session->priv->migration = g_object_ref(mig.session);
> +
>      main_priv->migrate_data = &mig;
>  
>      /* no need to track idle, call is sync for this coroutine */
> @@ -2166,7 +2172,6 @@ static void main_migrate_connect(SpiceChannel *channel,
>  
>      /* switch to main loop and wait for connections */
>      coroutine_yield(NULL);
> -    g_return_if_fail(mig.session != NULL);
>  
>      if (mig.nchannels != 0) {
>          reply_type = SPICE_MSGC_MAIN_MIGRATE_CONNECT_ERROR;
> @@ -2184,6 +2189,8 @@ static void main_migrate_connect(SpiceChannel *channel,
>      }
>      g_object_unref(mig.session);
>  
> +end:
> +    CHANNEL_DEBUG(channel, "migrate connect reply %d", reply_type);
>      out = spice_msg_out_new(SPICE_CHANNEL(channel), reply_type);
>      spice_msg_out_send(out);
>  }
> -- 
> 1.9.3
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20141112/f1aaf99f/attachment.sig>


More information about the Spice-devel mailing list