diff options
author | Thomas Haller <thaller@redhat.com> | 2016-04-25 13:50:54 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2016-04-25 13:50:54 +0200 |
commit | a09a5f7fc116ba5531c431e73a87b4cd87ace2b9 (patch) | |
tree | 909ddbd97cedd4f0b4f170b9ec7c5e83541c6ab2 | |
parent | 753f727af566a56e548613c35a3ccffe3d212d3b (diff) | |
download | NetworkManager-a09a5f7fc116ba5531c431e73a87b4cd87ace2b9.tar.gz |
sleep-monitor: disconnect signal handlers from D-Bus proxy on destroy
The lifetime of the proxy is not necesarily the same as the lifetime
of the NMSleepMonitor instance. Disconnect the signals during dispose().
-rw-r--r-- | src/nm-sleep-monitor-systemd.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/nm-sleep-monitor-systemd.c b/src/nm-sleep-monitor-systemd.c index 627e6c2026..a006d4c7c1 100644 --- a/src/nm-sleep-monitor-systemd.c +++ b/src/nm-sleep-monitor-systemd.c @@ -60,6 +60,9 @@ struct _NMSleepMonitor { GCancellable *cancellable; gint inhibit_fd; + + gulong sig_id_1; + gulong sig_id_2; }; struct _NMSleepMonitorClass { @@ -230,9 +233,11 @@ on_proxy_acquired (GObject *object, self->sd_proxy = sd_proxy; g_clear_object (&self->cancellable); - g_signal_connect (self->sd_proxy, "notify::g-name-owner", G_CALLBACK (name_owner_cb), self); - _nm_dbus_signal_connect (self->sd_proxy, "PrepareForSleep", G_VARIANT_TYPE ("(b)"), - G_CALLBACK (prepare_for_sleep_cb), self); + self->sig_id_1 = g_signal_connect (self->sd_proxy, "notify::g-name-owner", + G_CALLBACK (name_owner_cb), self); + self->sig_id_2 = _nm_dbus_signal_connect (self->sd_proxy, "PrepareForSleep", + G_VARIANT_TYPE ("(b)"), + G_CALLBACK (prepare_for_sleep_cb), self); owner = g_dbus_proxy_get_name_owner (self->sd_proxy); if (owner) @@ -262,7 +267,11 @@ dispose (GObject *object) /* drop_inhibitor() also clears our "cancellable" */ drop_inhibitor (self); - g_clear_object (&self->sd_proxy); + if (self->sd_proxy) { + nm_clear_g_signal_handler (self->sd_proxy, &self->sig_id_1); + nm_clear_g_signal_handler (self->sd_proxy, &self->sig_id_2); + g_clear_object (&self->sd_proxy); + } G_OBJECT_CLASS (nm_sleep_monitor_parent_class)->dispose (object); } |