mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-24 03:02:10 +01:00
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:
parent
1498c2bfe4
commit
b9f54c4e9a
@ -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:
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user