From b3a1b201431b649b5fb37d1c10a2609e92d06239 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Sat, 26 May 2012 15:56:10 -0500 Subject: avoid a cyclical refcount dependency between IndicatorPower and its DBusListener --- src/dbus-listener.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/dbus-listener.c b/src/dbus-listener.c index fe8af09..9f62f25 100644 --- a/src/dbus-listener.c +++ b/src/dbus-listener.c @@ -101,6 +101,20 @@ indicator_power_dbus_listener_init (IndicatorPowerDbusListener *self) self->priv = priv; } +static void +set_indicator (IndicatorPowerDbusListener * self, GObject * ipower) +{ + IndicatorPowerDbusListenerPrivate * priv = self->priv; + + if (priv->ipower != NULL) + g_object_remove_weak_pointer (G_OBJECT(priv->ipower), (gpointer*)&priv->ipower); + + priv->ipower = INDICATOR_POWER(ipower); + + if (priv->ipower != NULL) + g_object_add_weak_pointer (G_OBJECT(priv->ipower), (gpointer*)&priv->ipower); +}; + static void indicator_power_dbus_listener_dispose (GObject *object) { @@ -109,7 +123,8 @@ indicator_power_dbus_listener_dispose (GObject *object) g_clear_object (&priv->proxy); g_clear_object (&priv->proxy_cancel); - g_clear_object (&priv->ipower); + + set_indicator (self, NULL); G_OBJECT_CLASS (indicator_power_dbus_listener_parent_class)->dispose (object); } @@ -142,12 +157,11 @@ static void set_property (GObject * o, guint prop_id, const GValue * value, GParamSpec * pspec) { IndicatorPowerDbusListener * self = INDICATOR_POWER_DBUS_LISTENER(o); - IndicatorPowerDbusListenerPrivate * priv = self->priv; switch (prop_id) { case PROP_INDICATOR: - priv->ipower = g_value_dup_object (value); + set_indicator (self, g_value_get_object(value)); break; } } -- cgit v1.2.3