[virt-tools-list] [PATCH virt-viewer] Spice: listen for new 'SpiceSession::disconnected' signal
Victor Toso
victortoso at redhat.com
Wed Sep 19 12:05:26 UTC 2018
Hi,
On Tue, Sep 18, 2018 at 11:25:30AM -0500, Jonathon Jongsma wrote:
> Previously we were emitting the VirtViewerSession::session-disconnected
> when we got the Spice::session::channel-destroy signal for the last
> channel. However, since the channels are still valid at this point, and
> because VirtViewerApp quits the application in response to the
> session-disconnected signal, that means that the channels were never
> being properly freed. This was particularly problematic for the usbredir
> channel, which must disconnect any connected USB devices as part of its
> destruction. By using the new SpiceSession::disconnected signal instead,
> we can ensure that all channels have been disconnected and properly
> destroyed before quitting the application.
Acked-by: Victor Toso <victortoso at redhat.com>
> ---
>
> NOTE: this is an older patch fell through the cracks. I added the
> SpiceSession::disconnected signal a while ago and was waiting for an
> official spice-gtk release before adding this patch to virt-viewer. The
> new spice-gtk release has been out for a while, but this patch was
> forgotten until now.
Well, still is from latest release of spice-gtk ;)
https://gitlab.freedesktop.org/spice/spice-gtk/commit/1c08a1171c3815f89be84b3678657fc9c50cd140
> src/virt-viewer-session-spice.c | 24 +++++++++++++++++++-----
> 1 file changed, 19 insertions(+), 5 deletions(-)
>
> diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c
> index fdc7004..cb06af2 100644
> --- a/src/virt-viewer-session-spice.c
> +++ b/src/virt-viewer-session-spice.c
> @@ -50,7 +50,7 @@ struct _VirtViewerSessionSpicePrivate {
> guint pass_try;
> gboolean did_auto_conf;
> VirtViewerFileTransferDialog *file_transfer_dialog;
> -
> + GError *disconnect_error;
> };
>
> #define VIRT_VIEWER_SESSION_SPICE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), VIRT_VIEWER_TYPE_SESSION_SPICE, VirtViewerSessionSpicePrivate))
> @@ -75,6 +75,8 @@ static void virt_viewer_session_spice_channel_new(SpiceSession *s,
> static void virt_viewer_session_spice_channel_destroy(SpiceSession *s,
> SpiceChannel *channel,
> VirtViewerSession *session);
> +static void virt_viewer_session_spice_session_disconnected(SpiceSession *s,
> + VirtViewerSessionSpice *session);
> static void virt_viewer_session_spice_smartcard_insert(VirtViewerSession *session);
> static void virt_viewer_session_spice_smartcard_remove(VirtViewerSession *session);
> static gboolean virt_viewer_session_spice_fullscreen_auto_conf(VirtViewerSessionSpice *self);
> @@ -152,6 +154,7 @@ virt_viewer_session_spice_dispose(GObject *obj)
> gtk_widget_destroy(GTK_WIDGET(spice->priv->file_transfer_dialog));
> spice->priv->file_transfer_dialog = NULL;
> }
> + g_clear_error(&spice->priv->disconnect_error);
>
> G_OBJECT_CLASS(virt_viewer_session_spice_parent_class)->dispose(obj);
> }
> @@ -398,6 +401,8 @@ create_spice_session(VirtViewerSessionSpice *self)
> G_CALLBACK(virt_viewer_session_spice_channel_new), self, 0);
> virt_viewer_signal_connect_object(self->priv->session, "channel-destroy",
> G_CALLBACK(virt_viewer_session_spice_channel_destroy), self, 0);
> + virt_viewer_signal_connect_object(self->priv->session, "disconnected",
> + G_CALLBACK(virt_viewer_session_spice_session_disconnected), self, 0);
>
> usb_manager = spice_usb_device_manager_get(self->priv->session, NULL);
> if (usb_manager) {
> @@ -1091,6 +1096,13 @@ virt_viewer_session_spice_fullscreen_auto_conf(VirtViewerSessionSpice *self)
> return TRUE;
> }
>
> +static void
> +virt_viewer_session_spice_session_disconnected(G_GNUC_UNUSED SpiceSession *s,
> + VirtViewerSessionSpice *self)
> +{
> + g_signal_emit_by_name(self, "session-disconnected", self->priv->disconnect_error);
> +}
> +
> static void
> virt_viewer_session_spice_channel_destroy(G_GNUC_UNUSED SpiceSession *s,
> SpiceChannel *channel,
> @@ -1129,10 +1141,12 @@ virt_viewer_session_spice_channel_destroy(G_GNUC_UNUSED SpiceSession *s,
> if (self->priv->usbredir_channel_count == 0)
> virt_viewer_session_set_has_usbredir(session, FALSE);
> }
> -
> - self->priv->channel_count--;
> - if (self->priv->channel_count == 0)
> - g_signal_emit_by_name(self, "session-disconnected", error ? error->message : NULL);
> + if (error) {
> + g_warning("Channel error: %s", error->message);
> + if (self->priv->disconnect_error == NULL) {
> + self->priv->disconnect_error = g_error_copy(error);
> + }
> + }
> }
>
> VirtViewerSession *
> --
> 2.14.4
>
> _______________________________________________
> virt-tools-list mailing list
> virt-tools-list at redhat.com
> https://www.redhat.com/mailman/listinfo/virt-tools-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/virt-tools-list/attachments/20180919/42cc4b2e/attachment.sig>
More information about the virt-tools-list
mailing list