diff --git a/sharing/fake_nearby_connections_manager.cc b/sharing/fake_nearby_connections_manager.cc index b80800bf..af5199f5 100644 --- a/sharing/fake_nearby_connections_manager.cc +++ b/sharing/fake_nearby_connections_manager.cc @@ -57,7 +57,10 @@ void FakeNearbyConnectionsManager::StartAdvertising( ConnectionsCallback callback) { NL_DCHECK(!IsAdvertising()); is_shutdown_ = false; - advertising_listener_ = listener; + { + absl::MutexLock lock(&listener_mutex_); + advertising_listener_ = listener; + } advertising_data_usage_ = data_usage; advertising_power_level_ = power_level; advertising_endpoint_info_ = std::move(endpoint_info); @@ -73,7 +76,10 @@ void FakeNearbyConnectionsManager::StopAdvertising( ConnectionsCallback callback) { NL_DCHECK(IsAdvertising()); NL_DCHECK(!is_shutdown()); - advertising_listener_ = nullptr; + { + absl::MutexLock lock(&listener_mutex_); + advertising_listener_ = nullptr; + } advertising_data_usage_ = DataUsage::UNKNOWN_DATA_USAGE; advertising_power_level_ = PowerLevel::kUnknown; advertising_endpoint_info_.reset(); @@ -89,6 +95,7 @@ void FakeNearbyConnectionsManager::StartDiscovery( DiscoveryListener* listener, DataUsage data_usage, ConnectionsCallback callback) { is_shutdown_ = false; + absl::MutexLock lock(&listener_mutex_); discovery_listener_ = listener; std::move(callback)(Status::kSuccess); } @@ -96,6 +103,7 @@ void FakeNearbyConnectionsManager::StartDiscovery( void FakeNearbyConnectionsManager::StopDiscovery() { NL_DCHECK(IsDiscovering()); NL_DCHECK(!is_shutdown()); + absl::MutexLock lock(&listener_mutex_); discovery_listener_ = nullptr; } @@ -204,23 +212,33 @@ void FakeNearbyConnectionsManager::UpgradeBandwidth( void FakeNearbyConnectionsManager::OnEndpointFound( absl::string_view endpoint_id, std::unique_ptr info) { - if (discovery_listener_ == nullptr) return; - - discovery_listener_->OnEndpointDiscovered(endpoint_id, info->endpoint_info); + DiscoveryListener* listener = nullptr; + { + absl::MutexLock lock(&listener_mutex_); + listener = discovery_listener_; + } + if (listener == nullptr) return; + listener->OnEndpointDiscovered(endpoint_id, info->endpoint_info); } void FakeNearbyConnectionsManager::OnEndpointLost( absl::string_view endpoint_id) { - if (!discovery_listener_) return; - - discovery_listener_->OnEndpointLost(endpoint_id); + DiscoveryListener* listener = nullptr; + { + absl::MutexLock lock(&listener_mutex_); + listener = discovery_listener_; + } + if (listener == nullptr) return; + listener->OnEndpointLost(endpoint_id); } bool FakeNearbyConnectionsManager::IsAdvertising() const { + absl::MutexLock lock(&listener_mutex_); return advertising_listener_ != nullptr; } bool FakeNearbyConnectionsManager::IsDiscovering() const { + absl::MutexLock lock(&listener_mutex_); return discovery_listener_ != nullptr; } @@ -264,6 +282,7 @@ FakeNearbyConnectionsManager::GetRegisteredPayloadPath(int64_t payload_id) { } void FakeNearbyConnectionsManager::CleanupForProcessStopped() { + absl::MutexLock lock(&listener_mutex_); advertising_listener_ = nullptr; advertising_data_usage_ = DataUsage::UNKNOWN_DATA_USAGE; advertising_power_level_ = PowerLevel::kUnknown; diff --git a/sharing/fake_nearby_connections_manager.h b/sharing/fake_nearby_connections_manager.h index 8a8a557d..085b85e9 100644 --- a/sharing/fake_nearby_connections_manager.h +++ b/sharing/fake_nearby_connections_manager.h @@ -146,8 +146,11 @@ class FakeNearbyConnectionsManager : public NearbyConnectionsManager { void HandleStartAdvertisingCallback(ConnectionsStatus status); void HandleStopAdvertisingCallback(ConnectionsStatus status); - IncomingConnectionListener* advertising_listener_ = nullptr; - DiscoveryListener* discovery_listener_ = nullptr; + mutable absl::Mutex listener_mutex_; + IncomingConnectionListener* advertising_listener_ + ABSL_GUARDED_BY(listener_mutex_) = nullptr; + DiscoveryListener* discovery_listener_ ABSL_GUARDED_BY(listener_mutex_) = + nullptr; bool is_shutdown_ = false; proto::DataUsage advertising_data_usage_ = proto::DataUsage::UNKNOWN_DATA_USAGE;