[mutter] seat/native: Explicitly destroy MetaSeatImpl
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] seat/native: Explicitly destroy MetaSeatImpl
- Date: Tue, 19 Jan 2021 23:04:26 +0000 (UTC)
commit 05765daabf4a1aafa6fb9f296e7084d606b8430e
Author: Jonas Ã…dahl <jadahl gmail com>
Date: Thu Jan 14 16:07:40 2021 +0100
seat/native: Explicitly destroy MetaSeatImpl
We can't post tasks to the input thread when cleaning up the
MetaSeatImpl, as that will make the GTask complain about adding
references to a to be purged object. Avoid this by adding an explicit
meta_seat_impl_destroy() function that handles the destruction of the
MetaSeatImpl properly.
This also does more of the cleanup in the input thread, as that is where
it was managed. Will likely not make a difference as before this
happened after tearing down the thread, but lets tear down things in the
thread they were managed for good measure.
This fixes the last log spew I see right now when terminating mutter.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1670>
src/backends/native/meta-seat-impl.c | 53 +++++++++++++++++++---------------
src/backends/native/meta-seat-impl.h | 2 ++
src/backends/native/meta-seat-native.c | 2 +-
3 files changed, 32 insertions(+), 25 deletions(-)
---
diff --git a/src/backends/native/meta-seat-impl.c b/src/backends/native/meta-seat-impl.c
index 9e33f70be9..9e7f99e405 100644
--- a/src/backends/native/meta-seat-impl.c
+++ b/src/backends/native/meta-seat-impl.c
@@ -2753,7 +2753,8 @@ meta_seat_impl_get_property (GObject *object,
static gboolean
destroy_in_impl (GTask *task)
{
- MetaSeatImpl *seat_impl = g_task_get_task_data (task);
+ MetaSeatImpl *seat_impl = g_task_get_source_object (task);
+ gboolean numlock_active;
g_slist_foreach (seat_impl->devices,
(GFunc) meta_input_device_native_detach_libinput_in_impl,
@@ -2762,6 +2763,21 @@ destroy_in_impl (GTask *task)
seat_impl->devices = NULL;
g_clear_pointer (&seat_impl->libinput, libinput_unref);
+ g_clear_pointer (&seat_impl->tools, g_hash_table_unref);
+ g_clear_pointer (&seat_impl->touch_states, g_hash_table_destroy);
+ g_clear_object (&seat_impl->udev_client);
+ g_clear_pointer (&seat_impl->event_source, meta_event_source_free);
+
+ numlock_active =
+ xkb_state_mod_name_is_active (seat_impl->xkb, XKB_MOD_NAME_NUM,
+ XKB_STATE_MODS_LATCHED |
+ XKB_STATE_MODS_LOCKED);
+ meta_input_settings_maybe_save_numlock_state (seat_impl->input_settings,
+ numlock_active);
+
+ g_clear_pointer (&seat_impl->xkb, xkb_state_unref);
+
+ meta_seat_impl_clear_repeat_source (seat_impl);
g_main_loop_quit (seat_impl->input_loop);
g_task_return_boolean (task, TRUE);
@@ -2769,18 +2785,14 @@ destroy_in_impl (GTask *task)
return G_SOURCE_REMOVE;
}
-static void
-meta_seat_impl_finalize (GObject *object)
+void
+meta_seat_impl_destroy (MetaSeatImpl *seat_impl)
{
- MetaSeatImpl *seat_impl = META_SEAT_IMPL (object);
- gboolean numlock_active;
-
if (seat_impl->libinput)
{
GTask *task;
task = g_task_new (seat_impl, NULL, NULL, NULL);
- g_task_set_task_data (task, seat_impl, NULL);
meta_seat_impl_run_input_task (seat_impl, task,
(GSourceFunc) destroy_in_impl);
g_object_unref (task);
@@ -2789,25 +2801,18 @@ meta_seat_impl_finalize (GObject *object)
g_assert (!seat_impl->libinput);
}
- g_clear_pointer (&seat_impl->tools, g_hash_table_unref);
-
- if (seat_impl->touch_states)
- g_hash_table_destroy (seat_impl->touch_states);
-
- g_object_unref (seat_impl->udev_client);
-
- meta_event_source_free (seat_impl->event_source);
-
- numlock_active =
- xkb_state_mod_name_is_active (seat_impl->xkb, XKB_MOD_NAME_NUM,
- XKB_STATE_MODS_LATCHED |
- XKB_STATE_MODS_LOCKED);
- meta_input_settings_maybe_save_numlock_state (seat_impl->input_settings,
- numlock_active);
+ g_object_unref (seat_impl);
+}
- xkb_state_unref (seat_impl->xkb);
+static void
+meta_seat_impl_finalize (GObject *object)
+{
+ MetaSeatImpl *seat_impl = META_SEAT_IMPL (object);
- meta_seat_impl_clear_repeat_source (seat_impl);
+ g_assert (!seat_impl->libinput);
+ g_assert (!seat_impl->tools);
+ g_assert (!seat_impl->udev_client);
+ g_assert (!seat_impl->event_source);
g_free (seat_impl->seat_id);
diff --git a/src/backends/native/meta-seat-impl.h b/src/backends/native/meta-seat-impl.h
index ab0ef75d38..05f8d6fd3d 100644
--- a/src/backends/native/meta-seat-impl.h
+++ b/src/backends/native/meta-seat-impl.h
@@ -129,6 +129,8 @@ G_DECLARE_FINAL_TYPE (MetaSeatImpl, meta_seat_impl,
MetaSeatImpl * meta_seat_impl_new (MetaSeatNative *seat_native,
const char *seat_id);
+void meta_seat_impl_destroy (MetaSeatImpl *seat_impl);
+
void meta_seat_impl_run_input_task (MetaSeatImpl *seat_impl,
GTask *task,
GSourceFunc dispatch_func);
diff --git a/src/backends/native/meta-seat-native.c b/src/backends/native/meta-seat-native.c
index 9b931932bd..99ca974f26 100644
--- a/src/backends/native/meta-seat-native.c
+++ b/src/backends/native/meta-seat-native.c
@@ -225,7 +225,7 @@ meta_seat_native_finalize (GObject *object)
xkb_keymap_unref (seat->xkb_keymap);
g_clear_object (&seat->core_pointer);
g_clear_object (&seat->core_keyboard);
- g_clear_object (&seat->impl);
+ g_clear_pointer (&seat->impl, meta_seat_impl_destroy);
for (iter = seat->devices; iter; iter = g_list_next (iter))
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]