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

Commit d222c448 authored by Myles Watson's avatar Myles Watson Committed by android-build-merger
Browse files

Bluetooth: Protect callbacks during shutdown

am: 9ef1f719

Change-Id: I12d75f2262ed199e42fa014d5c6c5f0270de2e18
parents 7c9f5c35 9ef1f719
Loading
Loading
Loading
Loading
+2 −8
Original line number Diff line number Diff line
@@ -159,23 +159,17 @@ void AsyncFdWatcher::ThreadRoutine() {
    }

    // Invoke the data ready callbacks if appropriate.
    std::vector<decltype(watched_fds_)::value_type> saved_callbacks;
    {
      // Hold the mutex to make sure that the callbacks are still valid.
      std::unique_lock<std::mutex> guard(internal_mutex_);
      for (auto& it : watched_fds_) {
        if (FD_ISSET(it.first, &read_fds)) {
          saved_callbacks.push_back(it);
        }
      }
    }

    for (auto& it : saved_callbacks) {
      if (it.second) {
        it.second(it.first);
        }
      }
    }
  }
}

} // namespace async
} // namespace bluetooth
+10 −5
Original line number Diff line number Diff line
@@ -268,6 +268,16 @@ bool VendorInterface::Open(InitializeCompleteCallback initialize_complete_cb,
}

void VendorInterface::Close() {
  // These callbacks may send HCI events (vendor-dependent), so make sure to
  // StopWatching the file descriptor after this.
  if (lib_interface_ != nullptr) {
    bt_vendor_lpm_mode_t mode = BT_VND_LPM_DISABLE;
    lib_interface_->op(BT_VND_OP_LPM_SET_MODE, &mode);

    int power_state = BT_VND_PWR_OFF;
    lib_interface_->op(BT_VND_OP_POWER_CTRL, &power_state);
  }

  fd_watcher_.StopWatchingFileDescriptors();

  if (hci_ != nullptr) {
@@ -276,12 +286,7 @@ void VendorInterface::Close() {
  }

  if (lib_interface_ != nullptr) {
    bt_vendor_lpm_mode_t mode = BT_VND_LPM_DISABLE;
    lib_interface_->op(BT_VND_OP_LPM_SET_MODE, &mode);

    lib_interface_->op(BT_VND_OP_USERIAL_CLOSE, nullptr);
    int power_state = BT_VND_PWR_OFF;
    lib_interface_->op(BT_VND_OP_POWER_CTRL, &power_state);
  }

  if (lib_handle_ != nullptr) {