From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> When running virt-viewer with the --reconnect argument, when the session closes, the VirtViewerWindow instances were being freed, but not the GtkWindow itself. So the orphaned window stayed around doing nothing. The GtkBuilder instance was also leaked. Fix these two leaks & also add some debugging to help future troubleshooting --- src/virt-viewer-app.c | 2 ++ src/virt-viewer-display-spice.c | 2 +- src/virt-viewer-session-spice.c | 4 ++++ src/virt-viewer-window.c | 5 +++++ 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c index 46af0f8..82149dc 100644 --- a/src/virt-viewer-app.c +++ b/src/virt-viewer-app.c @@ -517,6 +517,7 @@ virt_viewer_app_remove_nth_window(VirtViewerApp *self, gint nth) win = virt_viewer_app_get_nth_window(self, nth); g_return_val_if_fail(win != NULL, FALSE); + DEBUG_LOG("Remove window %d %p", nth, win); removed = g_hash_table_steal(self->priv->windows, &nth); g_warn_if_fail(removed); @@ -536,6 +537,7 @@ virt_viewer_app_set_nth_window(VirtViewerApp *self, gint nth, VirtViewerWindow * g_return_if_fail(virt_viewer_app_get_nth_window(self, nth) == NULL); key = g_malloc(sizeof(gint)); *key = nth; + DEBUG_LOG("Insert window %d %p", nth, win); g_hash_table_insert(self->priv->windows, key, win); virt_viewer_app_set_window_subtitle(self, win, nth); diff --git a/src/virt-viewer-display-spice.c b/src/virt-viewer-display-spice.c index 985e116..f7bb26d 100644 --- a/src/virt-viewer-display-spice.c +++ b/src/virt-viewer-display-spice.c @@ -110,7 +110,7 @@ display_mark(SpiceChannel *channel G_GNUC_UNUSED, gint mark, VirtViewerDisplay *display) { - DEBUG_LOG("display mark %d", mark); + DEBUG_LOG("Toggle monitor visibility %p %d", channel, mark); virt_viewer_display_set_show_hint(display, mark); } diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c index 361e413..d11d7a1 100644 --- a/src/virt-viewer-session-spice.c +++ b/src/virt-viewer-session-spice.c @@ -427,6 +427,8 @@ virt_viewer_session_spice_channel_new(SpiceSession *s, g_object_get(channel, "channel-id", &id, NULL); + DEBUG_LOG("New spice channel %p %s %d", channel, g_type_name(G_OBJECT_TYPE(channel)), id); + if (SPICE_IS_MAIN_CHANNEL(channel)) { if (self->priv->main_channel != NULL) g_signal_handlers_disconnect_by_func(self->priv->main_channel, @@ -522,6 +524,8 @@ virt_viewer_session_spice_channel_destroy(G_GNUC_UNUSED SpiceSession *s, g_return_if_fail(self != NULL); g_object_get(channel, "channel-id", &id, NULL); + DEBUG_LOG("Destroy SPICE channel %s %d", g_type_name(G_OBJECT_TYPE(channel)), id); + if (SPICE_IS_MAIN_CHANNEL(channel)) { DEBUG_LOG("zap main channel"); if (channel == SPICE_CHANNEL(self->priv->main_channel)) diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c index 771a8b9..58aea0f 100644 --- a/src/virt-viewer-window.c +++ b/src/virt-viewer-window.c @@ -179,6 +179,11 @@ virt_viewer_window_dispose (GObject *object) priv->display = NULL; } + DEBUG_LOG("Disposing window %p\n", object); + + gtk_widget_destroy(priv->window); + g_object_unref(priv->builder); + g_free(priv->subtitle); priv->subtitle = NULL; } -- 1.7.10