void RegisterAdvertiser(IdStatusCallback cb) override {
do_in_bta_thread(
FROM_HERE, Bind(&BleAdvertisingManager::RegisterAdvertiser,
- base::Unretained(BleAdvertisingManager::Get()),
+ BleAdvertisingManager::Get(),
Bind(&BleAdvertiserInterfaceImpl::RegisterAdvertiserCb,
base::Unretained(this), cb)));
}
if (!BleAdvertisingManager::IsInitialized()) return;
do_in_bta_thread(FROM_HERE,
Bind(&BleAdvertisingManager::GetOwnAddress,
- base::Unretained(BleAdvertisingManager::Get()),
- advertiser_id, jni_thread_wrapper(FROM_HERE, cb)));
+ BleAdvertisingManager::Get(), advertiser_id,
+ jni_thread_wrapper(FROM_HERE, cb)));
}
void SetParameters(uint8_t advertiser_id, AdvertiseParameters params,
tBTM_BLE_ADV_PARAMS* p_params = new tBTM_BLE_ADV_PARAMS;
parseParams(p_params, params);
- do_in_bta_thread(
- FROM_HERE,
- Bind(&BleAdvertisingManager::SetParameters,
- base::Unretained(BleAdvertisingManager::Get()), advertiser_id,
- base::Owned(p_params), jni_thread_wrapper(FROM_HERE, cb)));
+ do_in_bta_thread(FROM_HERE, Bind(&BleAdvertisingManager::SetParameters,
+ BleAdvertisingManager::Get(),
+ advertiser_id, base::Owned(p_params),
+ jni_thread_wrapper(FROM_HERE, cb)));
}
void SetData(int advertiser_id, bool set_scan_rsp, vector<uint8_t> data,
if (!BleAdvertisingManager::IsInitialized()) return;
do_in_bta_thread(
FROM_HERE,
- Bind(&BleAdvertisingManager::SetData,
- base::Unretained(BleAdvertisingManager::Get()), advertiser_id,
- set_scan_rsp, std::move(data), jni_thread_wrapper(FROM_HERE, cb)));
+ Bind(&BleAdvertisingManager::SetData, BleAdvertisingManager::Get(),
+ advertiser_id, set_scan_rsp, std::move(data),
+ jni_thread_wrapper(FROM_HERE, cb)));
}
void Enable(uint8_t advertiser_id, bool enable, StatusCallback cb,
if (!BleAdvertisingManager::IsInitialized()) return;
do_in_bta_thread(
FROM_HERE,
- Bind(&BleAdvertisingManager::Enable,
- base::Unretained(BleAdvertisingManager::Get()), advertiser_id,
- enable, jni_thread_wrapper(FROM_HERE, cb), duration,
+ Bind(&BleAdvertisingManager::Enable, BleAdvertisingManager::Get(),
+ advertiser_id, enable, jni_thread_wrapper(FROM_HERE, cb), duration,
maxExtAdvEvents, jni_thread_wrapper(FROM_HERE, timeout_cb)));
}
do_in_bta_thread(
FROM_HERE,
Bind(&BleAdvertisingManager::StartAdvertising,
- base::Unretained(BleAdvertisingManager::Get()), advertiser_id,
+ BleAdvertisingManager::Get(), advertiser_id,
jni_thread_wrapper(FROM_HERE, cb), base::Owned(p_params),
std::move(advertise_data), std::move(scan_response_data),
timeout_s * 100, jni_thread_wrapper(FROM_HERE, timeout_cb)));
do_in_bta_thread(
FROM_HERE,
Bind(&BleAdvertisingManager::StartAdvertisingSet,
- base::Unretained(BleAdvertisingManager::Get()),
- jni_thread_wrapper(FROM_HERE, cb), base::Owned(p_params),
- std::move(advertise_data), std::move(scan_response_data),
- base::Owned(p_periodic_params), std::move(periodic_data), duration,
- maxExtAdvEvents, jni_thread_wrapper(FROM_HERE, timeout_cb)));
+ BleAdvertisingManager::Get(), jni_thread_wrapper(FROM_HERE, cb),
+ base::Owned(p_params), std::move(advertise_data),
+ std::move(scan_response_data), base::Owned(p_periodic_params),
+ std::move(periodic_data), duration, maxExtAdvEvents,
+ jni_thread_wrapper(FROM_HERE, timeout_cb)));
}
void SetPeriodicAdvertisingParameters(
do_in_bta_thread(
FROM_HERE,
Bind(&BleAdvertisingManager::SetPeriodicAdvertisingParameters,
- base::Unretained(BleAdvertisingManager::Get()), advertiser_id,
+ BleAdvertisingManager::Get(), advertiser_id,
base::Owned(p_periodic_params),
jni_thread_wrapper(FROM_HERE, cb)));
}
VLOG(1) << __func__ << " advertiser_id: " << +advertiser_id;
if (!BleAdvertisingManager::IsInitialized()) return;
- do_in_bta_thread(
- FROM_HERE,
- Bind(&BleAdvertisingManager::SetPeriodicAdvertisingData,
- base::Unretained(BleAdvertisingManager::Get()), advertiser_id,
- std::move(data), jni_thread_wrapper(FROM_HERE, cb)));
+ do_in_bta_thread(FROM_HERE,
+ Bind(&BleAdvertisingManager::SetPeriodicAdvertisingData,
+ BleAdvertisingManager::Get(), advertiser_id,
+ std::move(data), jni_thread_wrapper(FROM_HERE, cb)));
}
void SetPeriodicAdvertisingEnable(int advertiser_id, bool enable,
<< " ,enable: " << enable;
if (!BleAdvertisingManager::IsInitialized()) return;
- do_in_bta_thread(
- FROM_HERE,
- Bind(&BleAdvertisingManager::SetPeriodicAdvertisingEnable,
- base::Unretained(BleAdvertisingManager::Get()), advertiser_id,
- enable, jni_thread_wrapper(FROM_HERE, cb)));
+ do_in_bta_thread(FROM_HERE,
+ Bind(&BleAdvertisingManager::SetPeriodicAdvertisingEnable,
+ BleAdvertisingManager::Get(), advertiser_id, enable,
+ jni_thread_wrapper(FROM_HERE, cb)));
}
};
using c_type = std::unique_ptr<CreatorParams>;
+BleAdvertisingManager* instance;
+base::WeakPtr<BleAdvertisingManagerImpl> instance_weakptr;
+
class BleAdvertisingManagerImpl
: public BleAdvertisingManager,
public BleAdvertiserHciInterface::AdvertisingEventObserver {
/* Connectable advertising set must be disabled when updating RPA */
bool restart = p_inst->IsEnabled() && p_inst->IsConnectable();
- auto hci_interface =
- ((BleAdvertisingManagerImpl*)BleAdvertisingManager::Get())
- ->GetHciInterface();
+ if (!instance_weakptr.get()) return;
+ auto hci_interface = instance_weakptr.get()->GetHciInterface();
if (restart) {
p_inst->enable_status = false;
}
}
+ base::WeakPtr<BleAdvertisingManagerImpl> GetWeakPtr() {
+ return weak_factory_.GetWeakPtr();
+ }
+
private:
BleAdvertiserHciInterface* GetHciInterface() { return hci_interface; }
base::WeakPtrFactory<BleAdvertisingManagerImpl> weak_factory_;
};
-BleAdvertisingManager* instance;
-
void btm_ble_adv_raddr_timer_timeout(void* data) {
- ((BleAdvertisingManagerImpl*)BleAdvertisingManager::Get())
- ->ConfigureRpa((AdvertisingInstance*)data, base::Bind(DoNothing));
+ BleAdvertisingManagerImpl* ptr = instance_weakptr.get();
+ if (ptr) ptr->ConfigureRpa((AdvertisingInstance*)data, base::Bind(DoNothing));
}
} // namespace
void BleAdvertisingManager::Initialize(BleAdvertiserHciInterface* interface) {
instance = new BleAdvertisingManagerImpl(interface);
+ instance_weakptr = ((BleAdvertisingManagerImpl*)instance)->GetWeakPtr();
}
bool BleAdvertisingManager::IsInitialized() { return instance; }
-BleAdvertisingManager* BleAdvertisingManager::Get() {
+base::WeakPtr<BleAdvertisingManager> BleAdvertisingManager::Get() {
CHECK(instance);
- return instance;
+ return instance_weakptr;
};
void BleAdvertisingManager::CleanUp() {
BleAdvertiserHciInterface::Initialize();
BleAdvertisingManager::Initialize(BleAdvertiserHciInterface::Get());
BleAdvertiserHciInterface::Get()->SetAdvertisingEventObserver(
- (BleAdvertisingManagerImpl*)BleAdvertisingManager::Get());
+ (BleAdvertisingManagerImpl*)BleAdvertisingManager::Get().get());
if (BleAdvertiserHciInterface::Get()->QuirkAdvertiserZeroHandle()) {
// If handle 0 can't be used, register advertiser for it, but never use it.
- BleAdvertisingManager::Get()->RegisterAdvertiser(Bind(DoNothing2));
+ BleAdvertisingManager::Get().get()->RegisterAdvertiser(Bind(DoNothing2));
}
}
// verify that if duration passed, or is about to pass, recomputation will shut
// down the advertiser completly
void testRecomputeTimeout1() {
- auto manager = (BleAdvertisingManagerImpl*)BleAdvertisingManager::Get();
+ auto manager = (BleAdvertisingManagerImpl*)BleAdvertisingManager::Get().get();
TimeTicks start = TimeTicks::Now();
TimeTicks end = start + TimeDelta::FromMilliseconds(111);
// verify that duration and maxExtAdvEvents are properly adjusted when
// recomputing.
void testRecomputeTimeout2() {
- auto manager = (BleAdvertisingManagerImpl*)BleAdvertisingManager::Get();
+ auto manager = (BleAdvertisingManagerImpl*)BleAdvertisingManager::Get().get();
TimeTicks start = TimeTicks::Now();
TimeTicks end = start + TimeDelta::FromMilliseconds(250);
// verify that if maxExtAdvEvents were sent, or are close to end, recomputation
// wil shut down the advertiser completly
void testRecomputeTimeout3() {
- auto manager = (BleAdvertisingManagerImpl*)BleAdvertisingManager::Get();
+ auto manager = (BleAdvertisingManagerImpl*)BleAdvertisingManager::Get().get();
TimeTicks start = TimeTicks::Now();
TimeTicks end = start + TimeDelta::FromMilliseconds(495);