deamon: Missing weak_urefs() added.
authorAmarnath Valluri <amarnath.valluri@linux.intel.com>
Thu, 1 Aug 2013 11:53:38 +0000 (14:53 +0300)
committerAmarnath Valluri <amarnath.valluri@linux.intel.com>
Thu, 1 Aug 2013 11:56:45 +0000 (14:56 +0300)
src/daemon/dbus/gsignond-dbus-auth-service-adapter.c
src/daemon/dbus/gsignond-dbus-identity-adapter.c

index 13054b6..3c6f162 100644 (file)
@@ -72,6 +72,7 @@ static gboolean _handle_query_identities (GSignondDbusAuthServiceAdapter *,
                                       const gchar *,
                                       gpointer);
 static gboolean _handle_clear (GSignondDbusAuthServiceAdapter *, GDBusMethodInvocation *, gpointer);
+static void _on_identity_disposed (gpointer data, GObject *object);
 
 static void
 _set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
@@ -116,7 +117,11 @@ _get_property (GObject *object, guint property_id, GValue *value, GParamSpec *ps
 static void
 _identity_unref (gpointer data, gpointer user_data)
 {
-    if (data) g_object_unref (data);
+    if (data && GSIGNOND_IS_DBUS_IDENTITY_ADAPTER(data)) {
+        GObject *identity = G_OBJECT (data);
+        g_object_weak_unref (identity, _on_identity_disposed, user_data);
+        g_object_unref (identity);
+    }
 }
 
 static void
@@ -127,7 +132,7 @@ _dispose (GObject *object)
     DBG("- unregistering dubs auth service. %d", G_OBJECT (self->priv->auth_service)->ref_count);
 
     if (self->priv->identities) {
-        g_list_foreach (self->priv->identities, _identity_unref, NULL);
+        g_list_foreach (self->priv->identities, _identity_unref, self);
     }
 
     if (self->priv->auth_service) {
index ab04975..8b0f2fc 100644 (file)
@@ -123,6 +123,7 @@ static gboolean _handle_store (GSignondDbusIdentityAdapter *, GDBusMethodInvocat
 static gboolean _handle_add_reference (GSignondDbusIdentityAdapter *, GDBusMethodInvocation *, const gchar *, gpointer);
 static gboolean _handle_remove_reference (GSignondDbusIdentityAdapter *, GDBusMethodInvocation *, const gchar *, gpointer);
 static void _emit_info_updated (GSignondIdentity *identity, GSignondIdentityChangeType change, gpointer userdata);
+static void _on_session_disposed (gpointer data, GObject *session);
 
 static void
 gsignond_dbus_identity_adapter_set_property (GObject *object,
@@ -204,8 +205,11 @@ gsignond_dbus_identity_adapter_get_property (GObject *object,
 static void
 _destroy_session (gpointer data, gpointer user_data)
 {
-    (void)user_data;
-    if (data) g_object_unref (G_OBJECT(data));
+    if (data && GSIGNOND_IS_DBUS_AUTH_SESSION_ADAPTER (data)) {
+        GObject *dbus_session = G_OBJECT (data);
+        g_object_weak_unref (dbus_session, _on_session_disposed, user_data);
+        g_object_unref (dbus_session);
+    }
 }
 
 static void
@@ -213,6 +217,10 @@ gsignond_dbus_identity_adapter_dispose (GObject *object)
 {
     GSignondDbusIdentityAdapter *self = GSIGNOND_DBUS_IDENTITY_ADAPTER (object);
 
+    if (self->priv->sessions) {
+        g_list_foreach (self->priv->sessions, _destroy_session, self);
+    }
+
     if (self->priv->identity) {
         if (self->priv->info_updated_handler_id) {
             g_signal_handler_disconnect (self->priv->identity, self->priv->info_updated_handler_id);
@@ -236,10 +244,6 @@ gsignond_dbus_identity_adapter_dispose (GObject *object)
         self->priv->identity = NULL;
     }
 
-    if (self->priv->sessions) {
-        g_list_foreach (self->priv->sessions, _destroy_session, NULL);
-    }
-
     if (self->priv->dbus_identity) {
         GDBusInterfaceSkeleton *iface = G_DBUS_INTERFACE_SKELETON(self->priv->dbus_identity);
         gsignond_dbus_identity_emit_unregistered (self->priv->dbus_identity);