[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