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

Commit ee32ce4c authored by Jack He's avatar Jack He Committed by Automerger Merge Worker
Browse files

Merge "le_audio_software_aidl: Fix race condition on start request confirm"...

Merge "le_audio_software_aidl: Fix race condition on start request confirm" into tm-qpr-dev am: 27f60fb2

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/modules/Bluetooth/+/20707787



Change-Id: I423b3cafa34755c679031b943043c9d285a5c576
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents dccb8261 27f60fb2
Loading
Loading
Loading
Loading
+17 −8
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@


#include "le_audio_software_aidl.h"
#include "le_audio_software_aidl.h"


#include <atomic>
#include <unordered_map>
#include <unordered_map>
#include <vector>
#include <vector>


@@ -70,25 +71,33 @@ LeAudioTransport::LeAudioTransport(void (*flush)(void),
BluetoothAudioCtrlAck LeAudioTransport::StartRequest(bool is_low_latency) {
BluetoothAudioCtrlAck LeAudioTransport::StartRequest(bool is_low_latency) {
  SetStartRequestState(StartRequestState::PENDING_BEFORE_RESUME);
  SetStartRequestState(StartRequestState::PENDING_BEFORE_RESUME);
  if (stream_cb_.on_resume_(true)) {
  if (stream_cb_.on_resume_(true)) {
    if (start_request_state_ == StartRequestState::CONFIRMED) {
    auto expected = StartRequestState::CONFIRMED;
    if (std::atomic_compare_exchange_strong(&start_request_state_, &expected,
                                            StartRequestState::IDLE)) {
      LOG_INFO("Start completed.");
      LOG_INFO("Start completed.");
      SetStartRequestState(StartRequestState::IDLE);
      return BluetoothAudioCtrlAck::SUCCESS_FINISHED;
      return BluetoothAudioCtrlAck::SUCCESS_FINISHED;
    }
    }


    if (start_request_state_ == StartRequestState::CANCELED) {
    expected = StartRequestState::CANCELED;
    if (std::atomic_compare_exchange_strong(&start_request_state_, &expected,
                                            StartRequestState::IDLE)) {
      LOG_INFO("Start request failed.");
      LOG_INFO("Start request failed.");
      SetStartRequestState(StartRequestState::IDLE);
      return BluetoothAudioCtrlAck::FAILURE;
      return BluetoothAudioCtrlAck::FAILURE;
    }
    }


    expected = StartRequestState::PENDING_BEFORE_RESUME;
    if (std::atomic_compare_exchange_strong(
            &start_request_state_, &expected,
            StartRequestState::PENDING_AFTER_RESUME)) {
      LOG_INFO("Start pending.");
      LOG_INFO("Start pending.");
    SetStartRequestState(StartRequestState::PENDING_AFTER_RESUME);
      return BluetoothAudioCtrlAck::PENDING;
      return BluetoothAudioCtrlAck::PENDING;
    }
    }
  }


  LOG_ERROR("Start request failed.");
  LOG_ERROR("Start request failed.");
  SetStartRequestState(StartRequestState::IDLE);
  auto expected = StartRequestState::PENDING_BEFORE_RESUME;
  std::atomic_compare_exchange_strong(&start_request_state_, &expected,
                                      StartRequestState::IDLE);
  return BluetoothAudioCtrlAck::FAILURE;
  return BluetoothAudioCtrlAck::FAILURE;
}
}