mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-04 18:00:18 +01:00
iwd: Subscribe to object-added/removed ObjectManager signals
GDBusObjectManagerClient's interface-added and interface-removed signals
are not emitted when the new interfaces are added to a completely new
object or the removal results in the object disappearing. In other
words one interface is never reported both through interface-added and
object-added (or -removed) signals. This kind of makes sense but isn't
documented explicitly so interface-added seemed to correspond to DBus
InterfacesAdded signals which it doesn't.
We need to watch for both kinds of signals and although most things
work without us receiving the signals at all, it causes some race
conditions. For example on hotplug, devices wouldn't transition to
"disconnected" if a device was discovered by NMManager before it
appeared on IWD's dbus interface because that scenario relied on the
dbus signal.
(cherry picked from commit 1c1f4a3b40)
This commit is contained in:
parent
f533ce5b95
commit
de093910a3
1 changed files with 35 additions and 17 deletions
|
|
@ -631,6 +631,38 @@ interface_removed(GDBusObjectManager *object_manager,
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
object_added(GDBusObjectManager *object_manager, GDBusObject *object, gpointer user_data)
|
||||
{
|
||||
GList *interfaces, *iter;
|
||||
|
||||
interfaces = g_dbus_object_get_interfaces(object);
|
||||
|
||||
for (iter = interfaces; iter; iter = iter->next) {
|
||||
GDBusInterface *interface = G_DBUS_INTERFACE(iter->data);
|
||||
|
||||
interface_added(NULL, object, interface, user_data);
|
||||
}
|
||||
|
||||
g_list_free_full(interfaces, g_object_unref);
|
||||
}
|
||||
|
||||
static void
|
||||
object_removed(GDBusObjectManager *object_manager, GDBusObject *object, gpointer user_data)
|
||||
{
|
||||
GList *interfaces, *iter;
|
||||
|
||||
interfaces = g_dbus_object_get_interfaces(object);
|
||||
|
||||
for (iter = interfaces; iter; iter = iter->next) {
|
||||
GDBusInterface *interface = G_DBUS_INTERFACE(iter->data);
|
||||
|
||||
interface_removed(NULL, object, interface, user_data);
|
||||
}
|
||||
|
||||
g_list_free_full(interfaces, g_object_unref);
|
||||
}
|
||||
|
||||
static void
|
||||
connection_removed(NMSettings *settings, NMSettingsConnection *sett_conn, gpointer user_data)
|
||||
{
|
||||
|
|
@ -696,22 +728,6 @@ _om_has_name_owner(GDBusObjectManager *object_manager)
|
|||
return !!name_owner;
|
||||
}
|
||||
|
||||
static void
|
||||
object_added(NMIwdManager *self, GDBusObject *object)
|
||||
{
|
||||
GList *interfaces, *iter;
|
||||
|
||||
interfaces = g_dbus_object_get_interfaces(object);
|
||||
|
||||
for (iter = interfaces; iter; iter = iter->next) {
|
||||
GDBusInterface *interface = G_DBUS_INTERFACE(iter->data);
|
||||
|
||||
interface_added(NULL, object, interface, self);
|
||||
}
|
||||
|
||||
g_list_free_full(interfaces, g_object_unref);
|
||||
}
|
||||
|
||||
static void
|
||||
release_object_manager(NMIwdManager *self)
|
||||
{
|
||||
|
|
@ -852,12 +868,14 @@ got_object_manager(GObject *object, GAsyncResult *result, gpointer user_data)
|
|||
"interface-removed",
|
||||
G_CALLBACK(interface_removed),
|
||||
self);
|
||||
g_signal_connect(priv->object_manager, "object-added", G_CALLBACK(object_added), self);
|
||||
g_signal_connect(priv->object_manager, "object-removed", G_CALLBACK(object_removed), self);
|
||||
|
||||
g_hash_table_remove_all(priv->known_networks);
|
||||
|
||||
objects = g_dbus_object_manager_get_objects(object_manager);
|
||||
for (iter = objects; iter; iter = iter->next)
|
||||
object_added(self, G_DBUS_OBJECT(iter->data));
|
||||
object_added(NULL, G_DBUS_OBJECT(iter->data), self);
|
||||
|
||||
g_list_free_full(objects, g_object_unref);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue