From 7b6951eed8dbbed99c311ac506ba0620bc1d3690 Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Wed, 8 May 2024 12:52:43 -0700 Subject: [PATCH] audio: Abort on data FMQ pointer corruption Issue a fatal error when the data FMQ detects internal pointers corruption. This condition indicates some low level problems and should be diagnosed as fast as possible. Bug: 338974476 Test: atest VtsHalAudioCoreTargetTest Change-Id: I962eba620149c7169f0f0a2dad4c4064232966d7 --- audio/aidl/default/Stream.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/audio/aidl/default/Stream.cpp b/audio/aidl/default/Stream.cpp index 697ff0d0f0..a70c12d57d 100644 --- a/audio/aidl/default/Stream.cpp +++ b/audio/aidl/default/Stream.cpp @@ -315,7 +315,11 @@ StreamInWorkerLogic::Status StreamInWorkerLogic::cycle() { bool StreamInWorkerLogic::read(size_t clientSize, StreamDescriptor::Reply* reply) { ATRACE_CALL(); StreamContext::DataMQ* const dataMQ = mContext->getDataMQ(); - const size_t byteCount = std::min({clientSize, dataMQ->availableToWrite(), mDataBufferSize}); + StreamContext::DataMQ::Error fmqError = StreamContext::DataMQ::Error::NONE; + std::string fmqErrorMsg; + const size_t byteCount = std::min( + {clientSize, dataMQ->availableToWrite(&fmqError, &fmqErrorMsg), mDataBufferSize}); + CHECK(fmqError == StreamContext::DataMQ::Error::NONE) << fmqErrorMsg; const bool isConnected = mIsConnected; const size_t frameSize = mContext->getFrameSize(); size_t actualFrameCount = 0; @@ -587,7 +591,10 @@ StreamOutWorkerLogic::Status StreamOutWorkerLogic::cycle() { bool StreamOutWorkerLogic::write(size_t clientSize, StreamDescriptor::Reply* reply) { ATRACE_CALL(); StreamContext::DataMQ* const dataMQ = mContext->getDataMQ(); - const size_t readByteCount = dataMQ->availableToRead(); + StreamContext::DataMQ::Error fmqError = StreamContext::DataMQ::Error::NONE; + std::string fmqErrorMsg; + const size_t readByteCount = dataMQ->availableToRead(&fmqError, &fmqErrorMsg); + CHECK(fmqError == StreamContext::DataMQ::Error::NONE) << fmqErrorMsg; const size_t frameSize = mContext->getFrameSize(); bool fatal = false; int32_t latency = mContext->getNominalLatencyMs();