At this point this doesn't make any other practical difference than making the code more logical, but in the next patch I'll fire the DEVICE_CONNECTION_CHANGED hook in set_device_info_valid(), and at that point it's important that the device isn't marked valid too early, because otherwise external code would see "valid" devices that however don't have the adapter set. --- src/modules/bluetooth/bluez5-util.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/modules/bluetooth/bluez5-util.c b/src/modules/bluetooth/bluez5-util.c index 23a53f1..e326695 100644 --- a/src/modules/bluetooth/bluez5-util.c +++ b/src/modules/bluetooth/bluez5-util.c @@ -634,7 +634,12 @@ static int parse_device_properties(pa_bluetooth_device *d, DBusMessageIter *i, b return -1; } - set_device_info_valid(d, 1); + if (!is_property_change && d->adapter) + set_device_info_valid(d, 1); + + /* If d->adapter is NULL, device_info_valid will be left as 0, and updated + * after all interfaces have been parsed. */ + return 0; } @@ -813,14 +818,19 @@ static void parse_interfaces_and_properties(pa_bluetooth_discovery *y, DBusMessa dbus_message_iter_next(&element_i); } - PA_HASHMAP_FOREACH(d, y->devices, state) + PA_HASHMAP_FOREACH(d, y->devices, state) { + if (d->device_info_valid != 0) + continue; + if (!d->adapter && d->adapter_path) { d->adapter = pa_hashmap_get(d->discovery->adapters, d->adapter_path); if (!d->adapter) { pa_log_error("Device %s is child of nonexistent adapter %s", d->path, d->adapter_path); set_device_info_valid(d, -1); - } + } else + set_device_info_valid(d, 1); } + } return; } -- 1.8.3.1