Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0a8b9be1 authored by Rahul Arya's avatar Rahul Arya
Browse files

[Connection Manager] Unregister for callbacks on shutdown

Bug: 272572974
Test: toggle Bluetooth while connected to a device
Change-Id: Id248cc0200205dd4a7e1b6f005cddf1c8cc936e2
parent 77772eaf
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -243,6 +243,16 @@ void AclManager::UnregisterLeCallbacks(LeConnectionCallbacks* callbacks, std::pr
  CallOn(pimpl_->le_impl_, &le_impl::handle_unregister_le_callbacks, common::Unretained(callbacks), std::move(promise));
}

void AclManager::UnregisterLeAcceptlistCallbacks(
    LeAcceptlistCallbacks* callbacks, std::promise<void> promise) {
  ASSERT(callbacks != nullptr);
  CallOn(
      pimpl_->le_impl_,
      &le_impl::handle_unregister_le_acceptlist_callbacks,
      common::Unretained(callbacks),
      std::move(promise));
}

void AclManager::CreateConnection(Address address) {
  CallOn(pimpl_->classic_impl_, &classic_impl::create_connection, address);
}
+2 −0
Original line number Diff line number Diff line
@@ -80,6 +80,8 @@ public:
 virtual void RegisterLeCallbacks(acl_manager::LeConnectionCallbacks* callbacks, os::Handler* handler);
 virtual void UnregisterLeCallbacks(acl_manager::LeConnectionCallbacks* callbacks, std::promise<void> promise);
 void RegisterLeAcceptlistCallbacks(acl_manager::LeAcceptlistCallbacks* callbacks);
 void UnregisterLeAcceptlistCallbacks(
     acl_manager::LeAcceptlistCallbacks* callbacks, std::promise<void> promise);

 // Generates OnConnectSuccess if connected, or OnConnectFail otherwise
 virtual void CreateConnection(Address address);
+9 −0
Original line number Diff line number Diff line
@@ -1222,6 +1222,15 @@ struct le_impl : public bluetooth::hci::LeAddressManagerCallback {
    promise.set_value();
  }

  void handle_unregister_le_acceptlist_callbacks(
      LeAcceptlistCallbacks* callbacks, std::promise<void> promise) {
    ASSERT_LOG(
        le_acceptlist_callbacks_ == callbacks,
        "Registered le callback entity is different then unregister request");
    le_acceptlist_callbacks_ = nullptr;
    promise.set_value();
  }

  bool check_connection_parameters(
      uint16_t conn_interval_min, uint16_t conn_interval_max, uint16_t conn_latency, uint16_t supervision_timeout) {
    if (conn_interval_min < 0x0006 || conn_interval_min > 0x0C80 || conn_interval_max < 0x0006 ||
+5 −1
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@

use std::{fmt::Debug, pin::Pin};

use bt_common::init_flags;
use cxx::UniquePtr;
pub use inner::*;
use log::warn;
@@ -140,7 +141,10 @@ impl InactiveLeAclManager for LeAclManagerImpl {
    ) -> Self::ActiveManager {
        let (tx, mut rx) = unbounded_channel();

        // only register callbacks if the feature is enabled
        if init_flags::use_unified_connection_manager_is_enabled() {
            self.0.pin_mut().register_rust_callbacks(Box::new(LeAclManagerCallbackShim(tx)));
        }

        spawn_local(async move {
            while let Some(f) = rx.recv().await {
+10 −0
Original line number Diff line number Diff line
@@ -74,6 +74,16 @@ struct LeAclManagerShim::impl : hci::acl_manager::LeAcceptlistCallbacks {
 public:
  impl() { acl_manager_ = shim::GetAclManager(); }

  ~impl() {
    if (callbacks_.has_value()) {
      callbacks_.reset();
      auto promise = std::promise<void>();
      auto future = promise.get_future();
      acl_manager_->UnregisterLeAcceptlistCallbacks(this, std::move(promise));
      future.wait();
    }
  }

  void CreateLeConnection(core::AddressWithType address, bool is_direct) {
    acl_manager_->CreateLeConnection(ToCppAddress(address), is_direct);
  }