| Index: device/bluetooth/bluez/bluetooth_device_bluez.cc
|
| diff --git a/device/bluetooth/bluez/bluetooth_device_bluez.cc b/device/bluetooth/bluez/bluetooth_device_bluez.cc
|
| index 273169fb091696278867a6f09fefd502eb658689..1de611f8368a25122593af6abd35d5de3b078b57 100644
|
| --- a/device/bluetooth/bluez/bluetooth_device_bluez.cc
|
| +++ b/device/bluetooth/bluez/bluetooth_device_bluez.cc
|
| @@ -180,7 +180,7 @@ BluetoothDeviceBlueZ::~BluetoothDeviceBlueZ() {
|
| for (const auto& iter : gatt_services_swapped) {
|
| DCHECK(adapter());
|
| adapter()->NotifyGattServiceRemoved(
|
| - static_cast<BluetoothRemoteGattServiceBlueZ*>(iter.second));
|
| + static_cast<BluetoothRemoteGattServiceBlueZ*>(iter.second.get()));
|
| }
|
| }
|
|
|
| @@ -675,41 +675,47 @@ void BluetoothDeviceBlueZ::GattServiceAdded(
|
|
|
| VLOG(1) << "Adding new remote GATT service for device: " << GetAddress();
|
|
|
| - BluetoothRemoteGattServiceBlueZ* service =
|
| - new BluetoothRemoteGattServiceBlueZ(adapter(), this, object_path);
|
| -
|
| - gatt_services_.set(service->GetIdentifier(),
|
| - std::unique_ptr<BluetoothRemoteGattService>(service));
|
| - DCHECK(service->object_path() == object_path);
|
| - DCHECK(service->GetUUID().IsValid());
|
| + std::unique_ptr<device::BluetoothRemoteGattService> service(
|
| + new BluetoothRemoteGattServiceBlueZ(adapter(), this, object_path));
|
| + auto insertion = gatt_services_.insert(
|
| + std::make_pair(service->GetIdentifier(), std::move(service)));
|
| + if (!insertion.second) {
|
| + // insertion failed.
|
| + VLOG(1) << "Insertion of new remote GATT service failed for device: "
|
| + << GetAddress();
|
| + return;
|
| + }
|
| + BluetoothRemoteGattServiceBlueZ* bluez =
|
| + static_cast<BluetoothRemoteGattServiceBlueZ*>(
|
| + insertion.first->second.get());
|
| + DCHECK(bluez->object_path() == object_path);
|
| + DCHECK(bluez->GetUUID().IsValid());
|
|
|
| DCHECK(adapter());
|
| - adapter()->NotifyGattServiceAdded(service);
|
| + adapter()->NotifyGattServiceAdded(bluez);
|
| }
|
|
|
| void BluetoothDeviceBlueZ::GattServiceRemoved(
|
| const dbus::ObjectPath& object_path) {
|
| - GattServiceMap::const_iterator iter =
|
| - gatt_services_.find(object_path.value());
|
| + auto iter = gatt_services_.find(object_path.value());
|
| if (iter == gatt_services_.end()) {
|
| VLOG(3) << "Unknown GATT service removed: " << object_path.value();
|
| return;
|
| }
|
| -
|
| - BluetoothRemoteGattServiceBlueZ* service =
|
| - static_cast<BluetoothRemoteGattServiceBlueZ*>(iter->second);
|
| -
|
| + // Hold onto the service so that we can erase it safely.
|
| + auto scoped_service = std::move(iter->second);
|
| + gatt_services_.erase(iter);
|
| + discovery_complete_notified_.erase(scoped_service.get());
|
| +
|
| + BluetoothRemoteGattServiceBlueZ* bluez =
|
| + static_cast<BluetoothRemoteGattServiceBlueZ*>(scoped_service.get());
|
| + DCHECK(bluez->object_path() == object_path);
|
| VLOG(1) << "Removing remote GATT service with UUID: '"
|
| - << service->GetUUID().canonical_value()
|
| + << scoped_service->GetUUID().canonical_value()
|
| << "' from device: " << GetAddress();
|
|
|
| - DCHECK(service->object_path() == object_path);
|
| - std::unique_ptr<BluetoothRemoteGattService> scoped_service =
|
| - gatt_services_.take_and_erase(iter->first);
|
| -
|
| DCHECK(adapter());
|
| - discovery_complete_notified_.erase(service);
|
| - adapter()->NotifyGattServiceRemoved(service);
|
| + adapter()->NotifyGattServiceRemoved(scoped_service.get());
|
| }
|
|
|
| void BluetoothDeviceBlueZ::UpdateGattServices(
|
|
|