mirror of
https://github.com/kidfromjupiter/nearby.git
synced 2026-09-14 22:56:12 -04:00
Avoid reading GATT server for same advertisement
PiperOrigin-RevId: 558944228
This commit is contained in:
committed by
Copybara-Service
parent
96750db706
commit
ea7aa00e0c
@@ -50,6 +50,7 @@ cc_library(
|
||||
"//internal/platform:uuid",
|
||||
"//proto/mediums:ble_frames_cc_proto",
|
||||
"@aappleby_smhasher//:libmurmur3",
|
||||
"@com_google_absl//absl/base:core_headers",
|
||||
"@com_google_absl//absl/container:flat_hash_map",
|
||||
"@com_google_absl//absl/container:flat_hash_set",
|
||||
"@com_google_absl//absl/numeric:int128",
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "connections/implementation/mediums/ble_v2/bloom_filter.h"
|
||||
#include "internal/flags/nearby_flags.h"
|
||||
#include "internal/platform/ble_v2.h"
|
||||
#include "internal/platform/byte_array.h"
|
||||
#include "internal/platform/logging.h"
|
||||
#include "internal/platform/multi_thread_executor.h"
|
||||
#include "internal/platform/mutex_lock.h"
|
||||
@@ -521,13 +522,35 @@ void DiscoveredPeripheralTracker::HandleAdvertisementHeader(
|
||||
<< absl::BytesToHexString(
|
||||
ByteArray(advertisement_header).data())
|
||||
<< " in thread";
|
||||
ByteArray advertisement_data{advertisement_header};
|
||||
if (fetching_advertisements_.contains(advertisement_data)) {
|
||||
NEARBY_LOGS(VERBOSE) << ": Ignore the advertisement header due to it "
|
||||
"is already in fetcing.";
|
||||
return;
|
||||
}
|
||||
|
||||
fetching_advertisements_.insert(advertisement_data);
|
||||
|
||||
if (executor_ == nullptr) {
|
||||
// The situation happens when flag value changed
|
||||
executor_ = std::make_unique<MultiThreadExecutor>(kGattThreadCount);
|
||||
}
|
||||
executor_->Execute([this, peripheral, advertisement_header,
|
||||
advertisement_fetcher =
|
||||
std::move(advertisement_fetcher)]() {
|
||||
std::move(advertisement_fetcher),
|
||||
advertisement_data =
|
||||
std::move(advertisement_data)]() {
|
||||
{
|
||||
MutexLock lock(&mutex_);
|
||||
if (!IsInterestingAdvertisementHeader(advertisement_header)) {
|
||||
NEARBY_LOGS(INFO)
|
||||
<< ": Ignore to read raw advertisement from server due to it "
|
||||
"is not interesting header now.";
|
||||
fetching_advertisements_.erase(advertisement_data);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<const ByteArray*> gatt_advertisement_bytes_list =
|
||||
FetchRawAdvertisementsInThread(peripheral, advertisement_header,
|
||||
std::move(advertisement_fetcher));
|
||||
@@ -537,6 +560,7 @@ void DiscoveredPeripheralTracker::HandleAdvertisementHeader(
|
||||
gatt_advertisement_bytes_list,
|
||||
/*service_uuid=*/{});
|
||||
UpdateCommonStateForFoundBleAdvertisement(advertisement_header);
|
||||
fetching_advertisements_.erase(advertisement_data);
|
||||
NEARBY_LOGS(VERBOSE)
|
||||
<< ": Completed to handle GATT advertisement "
|
||||
<< absl::BytesToHexString(ByteArray(advertisement_header).data())
|
||||
|
||||
@@ -20,6 +20,9 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "absl/base/thread_annotations.h"
|
||||
#include "absl/container/flat_hash_map.h"
|
||||
#include "absl/container/flat_hash_set.h"
|
||||
#include "connections/implementation/mediums//lost_entity_tracker.h"
|
||||
#include "connections/implementation/mediums/ble_v2/advertisement_read_result.h"
|
||||
#include "connections/implementation/mediums/ble_v2/ble_advertisement.h"
|
||||
@@ -289,6 +292,10 @@ class DiscoveredPeripheralTracker {
|
||||
absl::flat_hash_map<BleAdvertisement, GattAdvertisementInfo>
|
||||
gatt_advertisement_infos_ ABSL_GUARDED_BY(mutex_);
|
||||
|
||||
// Tracks the advertisements in GATT fetching.
|
||||
absl::flat_hash_set<ByteArray> fetching_advertisements_
|
||||
ABSL_GUARDED_BY(mutex_);
|
||||
|
||||
std::unique_ptr<MultiThreadExecutor> executor_ ABSL_GUARDED_BY(mutex_) =
|
||||
nullptr;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user