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

Commit ace108ce authored by Cheney Ni's avatar Cheney Ni
Browse files

A2DP: Do the connection task in the stack main thread

There is a profile queue to handle connection tasks sequentially, and
invokes the connect API in JNI thread while the previous task finishes.
However, since BtifAvStateMachine is running in the stack main thread,
it brings a race condition about the BtifAVPeer object between the JNI
and stack main threads. This change does A2DP connection task in the
main thread, so has no such race conditions.

Bug: 152595833
Test: make sure the opening event is in main thread manually
Change-Id: Ib40dc7c5fa3e839a894d6f7947ac8266eacd2022
Merged-In: Ib40dc7c5fa3e839a894d6f7947ac8266eacd2022
(cherry picked from commit 367c497abbc0ff5551a1b3210db35ad6540e2dfe)
parent cf94b824
Loading
Loading
Loading
Loading
+15 −10
Original line number Diff line number Diff line
@@ -2696,20 +2696,25 @@ static bt_status_t connect_int(RawAddress* peer_address, uint16_t uuid) {
  BTIF_TRACE_EVENT("%s: peer_address=%s uuid=0x%x", __func__,
                   peer_address->ToString().c_str(), uuid);

  auto connection_task = [](RawAddress* peer_address, uint16_t uuid) {
    BtifAvPeer* peer = nullptr;
    if (uuid == UUID_SERVCLASS_AUDIO_SOURCE) {
      peer = btif_av_source.FindOrCreatePeer(*peer_address, kBtaHandleUnknown);
    if (peer == nullptr) {
      return BT_STATUS_FAIL;
    }
    } else if (uuid == UUID_SERVCLASS_AUDIO_SINK) {
      peer = btif_av_sink.FindOrCreatePeer(*peer_address, kBtaHandleUnknown);
    if (peer == nullptr) {
      return BT_STATUS_FAIL;
    }
    if (peer == nullptr) {
      btif_queue_advance();
      return;
    }
    peer->StateMachine().ProcessEvent(BTIF_AV_CONNECT_REQ_EVT, nullptr);
  return BT_STATUS_SUCCESS;
  };
  bt_status_t status = do_in_main_thread(
      FROM_HERE, base::BindOnce(connection_task, peer_address, uuid));
  if (status != BT_STATUS_SUCCESS) {
    LOG(ERROR) << __func__ << ": can't post connection task to main_thread";
  }
  return status;
}

static void set_source_silence_peer_int(const RawAddress& peer_address,