diff --git a/internal/platform/implementation/windows/ble_gatt_client.cc b/internal/platform/implementation/windows/ble_gatt_client.cc index 809dff7f..0ba470ff 100644 --- a/internal/platform/implementation/windows/ble_gatt_client.cc +++ b/internal/platform/implementation/windows/ble_gatt_client.cc @@ -26,9 +26,12 @@ #include #include +#include "absl/functional/any_invocable.h" #include "absl/strings/escaping.h" #include "absl/strings/str_format.h" #include "absl/strings/str_join.h" +#include "absl/strings/string_view.h" +#include "absl/synchronization/mutex.h" #include "absl/types/optional.h" #include "internal/platform/byte_array.h" #include "internal/platform/implementation/ble_v2.h" @@ -624,10 +627,30 @@ void BleGattClient::OnCharacteristicValueChanged( } NEARBY_LOGS(VERBOSE) << __func__ << ": Got characteristic value length= " << data.size(); - absl::MutexLock lock(&mutex_); - DCHECK( - native_characteristic_map_[characteristic].on_characteristic_changed_cb); - native_characteristic_map_[characteristic].on_characteristic_changed_cb(data); + + absl::AnyInvocable + on_characteristic_changed_cb; + { + absl::MutexLock lock(&mutex_); + if (!native_characteristic_map_.contains(characteristic) || + !native_characteristic_map_[characteristic] + .on_characteristic_changed_cb) { + NEARBY_LOGS(INFO) << __func__ + << ": No registered callback for characteristic."; + return; + } + on_characteristic_changed_cb = + std::move(native_characteristic_map_[characteristic] + .on_characteristic_changed_cb); + } + + on_characteristic_changed_cb(std::move(data)); + + { + absl::MutexLock lock(&mutex_); + native_characteristic_map_[characteristic].on_characteristic_changed_cb = + std::move(on_characteristic_changed_cb); + } } } // namespace windows