Move to a common place error reporting, after the coroutine exits. --- gtk/spice-channel-priv.h | 3 ++- gtk/spice-channel.c | 25 +++++++++++++------------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/gtk/spice-channel-priv.h b/gtk/spice-channel-priv.h index bd7f490..d70cf86 100644 --- a/gtk/spice-channel-priv.h +++ b/gtk/spice-channel-priv.h @@ -66,7 +66,6 @@ struct _SpiceMsgIn { enum spice_channel_state { SPICE_CHANNEL_STATE_UNCONNECTED = 0, - SPICE_CHANNEL_STATE_FAILED_AUTHENTICATION, SPICE_CHANNEL_STATE_RECONNECTING, SPICE_CHANNEL_STATE_CONNECTING, SPICE_CHANNEL_STATE_READY, @@ -110,6 +109,8 @@ struct _SpiceChannelPrivate { char name[16]; enum spice_channel_state state; + SpiceChannelEvent event; + spice_parse_channel_func_t parser; SpiceMessageMarshallers *marshallers; guint channel_watch; diff --git a/gtk/spice-channel.c b/gtk/spice-channel.c index 0301204..2f0ae1a 100644 --- a/gtk/spice-channel.c +++ b/gtk/spice-channel.c @@ -1122,7 +1122,7 @@ static void spice_channel_failed_authentication(SpiceChannel *channel) SPICE_CLIENT_ERROR_AUTH_NEEDS_PASSWORD, _("Authentication failed: password is required")); - c->state = SPICE_CHANNEL_STATE_FAILED_AUTHENTICATION; + c->event = SPICE_CHANNEL_ERROR_AUTH; c->has_error = TRUE; /* force disconnect */ } @@ -2240,8 +2240,9 @@ static gboolean spice_channel_delayed_unref(gpointer data) g_return_val_if_fail(c->coroutine.coroutine.exited == TRUE, FALSE); - if (c->state == SPICE_CHANNEL_STATE_FAILED_AUTHENTICATION) { - g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_AUTH); + if (c->event != SPICE_CHANNEL_NONE) { + g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, c->event); + c->event = SPICE_CHANNEL_NONE; g_clear_error(&c->error); } @@ -2352,13 +2353,13 @@ static void *spice_channel_coroutine(void *data) if (spice_session_get_client_provided_socket(c->session)) { if (c->fd < 0) { g_critical("fd not provided!"); - g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_CONNECT); + c->event = SPICE_CHANNEL_ERROR_CONNECT; goto cleanup; } if (!(c->sock = g_socket_new_from_fd(c->fd, NULL))) { CHANNEL_DEBUG(channel, "Failed to open socket from fd %d", c->fd); - g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_CONNECT); + c->event = SPICE_CHANNEL_ERROR_CONNECT; goto cleanup; } @@ -2378,8 +2379,7 @@ reconnect: goto reconnect; } else { CHANNEL_DEBUG(channel, "Connect error"); - g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_CONNECT); - g_clear_error(&c->error); + c->event = SPICE_CHANNEL_ERROR_CONNECT; goto cleanup; } } @@ -2391,7 +2391,7 @@ reconnect: c->ctx = SSL_CTX_new(SSLv23_method()); if (c->ctx == NULL) { g_critical("SSL_CTX_new failed"); - g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_TLS); + c->event = SPICE_CHANNEL_ERROR_TLS; goto cleanup; } @@ -2407,7 +2407,7 @@ reconnect: g_warning("only pubkey active"); verify = SPICE_SESSION_VERIFY_PUBKEY; } else { - g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_TLS); + c->event = SPICE_CHANNEL_ERROR_TLS; goto cleanup; } } @@ -2425,7 +2425,7 @@ reconnect: c->ssl = SSL_new(c->ctx); if (c->ssl == NULL) { g_critical("SSL_new failed"); - g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_TLS); + c->event = SPICE_CHANNEL_ERROR_TLS; goto cleanup; } @@ -2454,7 +2454,7 @@ ssl_reconnect: } else { g_warning("%s: SSL_connect: %s", c->name, ERR_error_string(rc, NULL)); - g_coroutine_signal_emit(channel, signals[SPICE_CHANNEL_EVENT], 0, SPICE_CHANNEL_ERROR_TLS); + c->event = SPICE_CHANNEL_ERROR_TLS; goto cleanup; } } @@ -2489,7 +2489,8 @@ cleanup: SPICE_CHANNEL_GET_CLASS(channel)->channel_disconnect(channel); - if (c->state == SPICE_CHANNEL_STATE_RECONNECTING) { + if (c->event == SPICE_CHANNEL_NONE && + c->state == SPICE_CHANNEL_STATE_RECONNECTING) { spice_channel_connect(channel); g_object_unref(channel); } else -- 2.1.0 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel