summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2016-04-25 13:50:54 +0200
committerThomas Haller <thaller@redhat.com>2016-04-25 13:50:54 +0200
commita09a5f7fc116ba5531c431e73a87b4cd87ace2b9 (patch)
tree909ddbd97cedd4f0b4f170b9ec7c5e83541c6ab2
parent753f727af566a56e548613c35a3ccffe3d212d3b (diff)
downloadNetworkManager-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.c17
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);
}