backend: Tear down in dispose() instead of finalize()

This means backend implementations can have more control of the order of
how things are destroyed. To be precise, this will, in the next commit,
allow us to destroy the logind integration after the clutter backend
thus the libinput owning seat, that uses the logind integration to
release input devices.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1670>
This commit is contained in:
Jonas Ådahl 2021-01-19 22:14:01 +01:00
parent 05765daabf
commit db6bf9d14e
3 changed files with 30 additions and 15 deletions

View File

@ -191,12 +191,16 @@ G_DEFINE_ABSTRACT_TYPE_WITH_CODE (MetaBackend, meta_backend, G_TYPE_OBJECT,
initable_iface_init));
static void
meta_backend_finalize (GObject *object)
meta_backend_dispose (GObject *object)
{
MetaBackend *backend = META_BACKEND (object);
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
g_list_free_full (priv->gpus, g_object_unref);
if (priv->gpus)
{
g_list_free_full (priv->gpus, g_object_unref);
priv->gpus = NULL;
}
g_clear_object (&priv->current_device);
g_clear_object (&priv->monitor_manager);
@ -213,9 +217,17 @@ meta_backend_finalize (GObject *object)
#endif
if (priv->sleep_signal_id)
g_dbus_connection_signal_unsubscribe (priv->system_bus, priv->sleep_signal_id);
{
g_dbus_connection_signal_unsubscribe (priv->system_bus, priv->sleep_signal_id);
priv->sleep_signal_id = 0;
}
if (priv->upower_watch_id)
g_bus_unwatch_name (priv->upower_watch_id);
{
g_bus_unwatch_name (priv->upower_watch_id);
priv->upower_watch_id = 0;
}
g_cancellable_cancel (priv->cancellable);
g_clear_object (&priv->cancellable);
g_clear_object (&priv->system_bus);
@ -223,7 +235,7 @@ meta_backend_finalize (GObject *object)
g_clear_handle_id (&priv->device_update_idle_id, g_source_remove);
g_hash_table_destroy (priv->device_monitors);
g_clear_pointer (&priv->device_monitors, g_hash_table_destroy);
g_clear_object (&priv->settings);
@ -233,7 +245,7 @@ meta_backend_finalize (GObject *object)
g_clear_object (&priv->clutter_backend);
G_OBJECT_CLASS (meta_backend_parent_class)->finalize (object);
G_OBJECT_CLASS (meta_backend_parent_class)->dispose (object);
}
static void
@ -805,7 +817,7 @@ meta_backend_class_init (MetaBackendClass *klass)
const gchar *mutter_stage_views;
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->finalize = meta_backend_finalize;
object_class->dispose = meta_backend_dispose;
object_class->constructed = meta_backend_constructed;
klass->post_init = meta_backend_real_post_init;

View File

@ -89,18 +89,21 @@ static void
disconnect_udev_device_added_handler (MetaBackendNative *native);
static void
meta_backend_native_finalize (GObject *object)
meta_backend_native_dispose (GObject *object)
{
MetaBackendNative *native = META_BACKEND_NATIVE (object);
if (native->udev_device_added_handler_id)
disconnect_udev_device_added_handler (native);
{
disconnect_udev_device_added_handler (native);
native->udev_device_added_handler_id = 0;
}
g_clear_object (&native->kms);
g_clear_object (&native->udev);
meta_launcher_free (native->launcher);
g_clear_pointer (&native->launcher, meta_launcher_free);
G_OBJECT_CLASS (meta_backend_native_parent_class)->finalize (object);
G_OBJECT_CLASS (meta_backend_native_parent_class)->dispose (object);
}
static ClutterBackend *
@ -521,7 +524,7 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
MetaBackendClass *backend_class = META_BACKEND_CLASS (klass);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->finalize = meta_backend_native_finalize;
object_class->dispose = meta_backend_native_dispose;
backend_class->create_clutter_backend = meta_backend_native_create_clutter_backend;

View File

@ -848,7 +848,7 @@ initable_iface_init (GInitableIface *initable_iface)
}
static void
meta_backend_x11_finalize (GObject *object)
meta_backend_x11_dispose (GObject *object)
{
MetaBackend *backend = META_BACKEND (object);
MetaBackendX11 *x11 = META_BACKEND_X11 (object);
@ -871,7 +871,7 @@ meta_backend_x11_finalize (GObject *object)
priv->user_active_alarm = None;
}
G_OBJECT_CLASS (meta_backend_x11_parent_class)->finalize (object);
G_OBJECT_CLASS (meta_backend_x11_parent_class)->dispose (object);
}
static void
@ -880,7 +880,7 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass)
MetaBackendClass *backend_class = META_BACKEND_CLASS (klass);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->finalize = meta_backend_x11_finalize;
object_class->dispose = meta_backend_x11_dispose;
backend_class->create_clutter_backend = meta_backend_x11_create_clutter_backend;
backend_class->post_init = meta_backend_x11_post_init;
backend_class->grab_device = meta_backend_x11_grab_device;