[mutter/gnome-3-30] compositor: Destroy window actors list on destruction



commit ffe94b0d73237e637c5198a7018e96f2f867f700
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date:   Mon Apr 29 19:57:03 2019 +0000

    compositor: Destroy window actors list on destruction
    
    When the compositor is destroyed we should cleanup the list of window actors we
    created and destroy them.
    Since all the actors are added to the window_group or top_window_group we can
    just destroy these containers (together with the feedback_group), and simply
    free the windows list.
    
    This is particularly needed under X11 because before we destroy the display, we
    might do some cleanups as detaching the surface pixmaps and freeing the damages
    and if this happens at later point (for example when triggered by garbage
    collector in gnome-shell), we might crash because the x11 dpy reference is
    already gone.
    
    Destroying the window actors instead, ensures we avoid any further call to X11
    related functions and that we release the actors XServer resources.
    
    Fixes https://gitlab.gnome.org/GNOME/mutter/issues/576
    
    
    (cherry picked from commit 7718e67f5c0c78ed93e9ad04e7254b6db70a0337)

 src/compositor/compositor.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)
---
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
index e1f597346..cc1455a8c 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -91,6 +91,10 @@ on_presented (ClutterStage     *stage,
               ClutterFrameInfo *frame_info,
               MetaCompositor   *compositor);
 
+static void
+on_top_window_actor_destroyed (MetaWindowActor *window_actor,
+                               MetaCompositor  *compositor);
+
 static gboolean
 is_modal (MetaDisplay *display)
 {
@@ -133,6 +137,19 @@ meta_compositor_destroy (MetaCompositor *compositor)
   clutter_threads_remove_repaint_func (compositor->pre_paint_func_id);
   clutter_threads_remove_repaint_func (compositor->post_paint_func_id);
 
+  if (compositor->top_window_actor)
+    {
+      g_signal_handlers_disconnect_by_func (compositor->top_window_actor,
+                                            on_top_window_actor_destroyed,
+                                            compositor);
+      compositor->top_window_actor = NULL;
+    }
+
+  g_clear_pointer (&compositor->window_group, clutter_actor_destroy);
+  g_clear_pointer (&compositor->top_window_group, clutter_actor_destroy);
+  g_clear_pointer (&compositor->feedback_group, clutter_actor_destroy);
+  g_clear_pointer (&compositor->windows, g_list_free);
+
   if (compositor->have_x11_sync_object)
     meta_sync_ring_destroy ();
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]