From fb0f03640a4fdc8bedaf6f64fd1781207b9d975c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Wed, 12 Aug 2020 15:28:34 +0200 Subject: [PATCH] stage-view: Add clutter_stage_view_destroy() This aims to make sure a view and its resources are destroyed when it should. Using references might keep certain components (e.g frame clock) alive for too long. We currently don't take any long lived references to the stage view anywhere, so this doesn't matter in practice, but this may change, and will be used by a to be added test case. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1404 --- clutter/clutter/clutter-stage-view.c | 7 +++++++ clutter/clutter/clutter-stage-view.h | 3 +++ clutter/clutter/cogl/clutter-stage-cogl.c | 8 ++++---- src/backends/meta-renderer.c | 2 +- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/clutter/clutter/clutter-stage-view.c b/clutter/clutter/clutter-stage-view.c index 9e19055d6..d02b92909 100644 --- a/clutter/clutter/clutter-stage-view.c +++ b/clutter/clutter/clutter-stage-view.c @@ -86,6 +86,13 @@ typedef struct _ClutterStageViewPrivate G_DEFINE_TYPE_WITH_PRIVATE (ClutterStageView, clutter_stage_view, G_TYPE_OBJECT) +void +clutter_stage_view_destroy (ClutterStageView *view) +{ + g_object_run_dispose (G_OBJECT (view)); + g_object_unref (view); +} + void clutter_stage_view_get_layout (ClutterStageView *view, cairo_rectangle_int_t *rect) diff --git a/clutter/clutter/clutter-stage-view.h b/clutter/clutter/clutter-stage-view.h index ff1963c5d..38b2aa001 100644 --- a/clutter/clutter/clutter-stage-view.h +++ b/clutter/clutter/clutter-stage-view.h @@ -52,6 +52,9 @@ struct _ClutterStageViewClass cairo_rectangle_int_t *dst_rect); }; +CLUTTER_EXPORT +void clutter_stage_view_destroy (ClutterStageView *view); + CLUTTER_EXPORT void clutter_stage_view_get_layout (ClutterStageView *view, cairo_rectangle_int_t *rect); diff --git a/clutter/clutter/cogl/clutter-stage-cogl.c b/clutter/clutter/cogl/clutter-stage-cogl.c index 695c594bb..4b07a4057 100644 --- a/clutter/clutter/cogl/clutter-stage-cogl.c +++ b/clutter/clutter/cogl/clutter-stage-cogl.c @@ -773,16 +773,16 @@ on_framebuffer_set (ClutterStageView *view) } static void -clutter_stage_view_cogl_finalize (GObject *object) +clutter_stage_view_cogl_dispose (GObject *object) { ClutterStageViewCogl *view_cogl = CLUTTER_STAGE_VIEW_COGL (object); ClutterStageViewCoglPrivate *view_priv = clutter_stage_view_cogl_get_instance_private (view_cogl); g_clear_handle_id (&view_priv->notify_presented_handle_id, g_source_remove); - clutter_damage_history_free (view_priv->damage_history); + g_clear_pointer (&view_priv->damage_history, clutter_damage_history_free); - G_OBJECT_CLASS (clutter_stage_view_cogl_parent_class)->finalize (object); + G_OBJECT_CLASS (clutter_stage_view_cogl_parent_class)->dispose (object); } static void @@ -802,5 +802,5 @@ clutter_stage_view_cogl_class_init (ClutterStageViewCoglClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - object_class->finalize = clutter_stage_view_cogl_finalize; + object_class->dispose = clutter_stage_view_cogl_dispose; } diff --git a/src/backends/meta-renderer.c b/src/backends/meta-renderer.c index c0bbb6133..27ea7c38a 100644 --- a/src/backends/meta-renderer.c +++ b/src/backends/meta-renderer.c @@ -143,7 +143,7 @@ meta_renderer_real_rebuild_views (MetaRenderer *renderer) meta_backend_get_monitor_manager (backend); GList *logical_monitors, *l; - g_list_free_full (priv->views, g_object_unref); + g_list_free_full (priv->views, (GDestroyNotify) clutter_stage_view_destroy); priv->views = NULL; logical_monitors =