GDBusObjectManagerClient: keep the manager alive while firing signals

Handlers for the signals we emit might unref the object manager. Make
sure we keep it alive until we are done with it.

https://bugzilla.gnome.org/show_bug.cgi?id=719402
This commit is contained in:
Rui Matos 2013-11-27 14:32:05 +01:00
parent 30e1ab3262
commit 1300108e0c

View File

@ -1006,6 +1006,7 @@ signal_cb (GDBusConnection *connection,
//g_debug ("yay, signal_cb %s %s: %s\n", signal_name, object_path, g_variant_print (parameters, TRUE)); //g_debug ("yay, signal_cb %s %s: %s\n", signal_name, object_path, g_variant_print (parameters, TRUE));
g_object_ref (manager);
if (g_strcmp0 (interface_name, "org.freedesktop.DBus.Properties") == 0) if (g_strcmp0 (interface_name, "org.freedesktop.DBus.Properties") == 0)
{ {
if (g_strcmp0 (signal_name, "PropertiesChanged") == 0) if (g_strcmp0 (signal_name, "PropertiesChanged") == 0)
@ -1087,6 +1088,7 @@ signal_cb (GDBusConnection *connection,
g_object_unref (interface); g_object_unref (interface);
} }
} }
g_object_unref (manager);
out: out:
g_clear_object (&object_proxy); g_clear_object (&object_proxy);
@ -1243,6 +1245,7 @@ on_notify_g_name_owner (GObject *object,
new_name_owner = g_dbus_proxy_get_name_owner (manager->priv->control_proxy); new_name_owner = g_dbus_proxy_get_name_owner (manager->priv->control_proxy);
manager->priv->name_owner = NULL; manager->priv->name_owner = NULL;
g_object_ref (manager);
if (g_strcmp0 (old_name_owner, new_name_owner) != 0) if (g_strcmp0 (old_name_owner, new_name_owner) != 0)
{ {
GList *l; GList *l;
@ -1319,6 +1322,7 @@ on_notify_g_name_owner (GObject *object,
} }
g_free (old_name_owner); g_free (old_name_owner);
g_object_unref (manager);
} }
static gboolean static gboolean
@ -1543,6 +1547,7 @@ add_interfaces (GDBusObjectManagerClient *manager,
g_mutex_unlock (&manager->priv->lock); g_mutex_unlock (&manager->priv->lock);
/* now that we don't hold the lock any more, emit signals */ /* now that we don't hold the lock any more, emit signals */
g_object_ref (manager);
for (l = interface_added_signals; l != NULL; l = l->next) for (l = interface_added_signals; l != NULL; l = l->next)
{ {
interface_proxy = G_DBUS_PROXY (l->data); interface_proxy = G_DBUS_PROXY (l->data);
@ -1558,8 +1563,8 @@ add_interfaces (GDBusObjectManagerClient *manager,
op); op);
g_signal_emit_by_name (manager, "object-added", op); g_signal_emit_by_name (manager, "object-added", op);
} }
g_object_unref (manager);
g_object_unref (op); g_object_unref (op);
} }
static void static void
@ -1592,6 +1597,7 @@ remove_interfaces (GDBusObjectManagerClient *manager,
num_interfaces_to_remove = g_strv_length ((gchar **) interface_names); num_interfaces_to_remove = g_strv_length ((gchar **) interface_names);
/* see if we are going to completety remove the object */ /* see if we are going to completety remove the object */
g_object_ref (manager);
if (num_interfaces_to_remove == num_interfaces) if (num_interfaces_to_remove == num_interfaces)
{ {
g_object_ref (op); g_object_ref (op);
@ -1617,6 +1623,7 @@ remove_interfaces (GDBusObjectManagerClient *manager,
} }
g_object_unref (op); g_object_unref (op);
} }
g_object_unref (manager);
out: out:
; ;
} }