summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Naganov <mnaganov@google.com>2024-05-08 12:50:36 -0700
committerMikhail Naganov <mnaganov@google.com>2024-05-08 16:50:50 -0700
commit3f3618b4244a1db06a62adb76ea7008a8145a96d (patch)
tree763d02c1363fb2c99f341490dc037434d46b5fd9
parent0c88d1c5ba12d74c8d6a30742dbfecfc29fe44b7 (diff)
downloadav-3f3618b4244a1db06a62adb76ea7008a8145a96d.tar.gz
libaudiohal@aidl: 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: m Change-Id: I8b9c9c9111ad0327db84ac3dc324e8a1cdf8c478
-rw-r--r--media/libaudiohal/impl/StreamHalAidl.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/media/libaudiohal/impl/StreamHalAidl.cpp b/media/libaudiohal/impl/StreamHalAidl.cpp
index 9d404a0d56..4c0ba37c12 100644
--- a/media/libaudiohal/impl/StreamHalAidl.cpp
+++ b/media/libaudiohal/impl/StreamHalAidl.cpp
@@ -323,8 +323,11 @@ status_t StreamHalAidl::transfer(void *buffer, size_t bytes, size_t *transferred
return INVALID_OPERATION;
}
}
+ StreamContextAidl::DataMQ::Error fmqError = StreamContextAidl::DataMQ::Error::NONE;
+ std::string fmqErrorMsg;
if (!mIsInput) {
- bytes = std::min(bytes, mContext.getDataMQ()->availableToWrite());
+ bytes = std::min(bytes,
+ mContext.getDataMQ()->availableToWrite(&fmqError, &fmqErrorMsg));
}
StreamDescriptor::Command burst =
StreamDescriptor::Command::make<StreamDescriptor::Command::Tag::burst>(bytes);
@@ -341,12 +344,14 @@ status_t StreamHalAidl::transfer(void *buffer, size_t bytes, size_t *transferred
LOG_ALWAYS_FATAL_IF(*transferred > bytes,
"%s: HAL module read %zu bytes, which exceeds requested count %zu",
__func__, *transferred, bytes);
- if (auto toRead = mContext.getDataMQ()->availableToRead();
+ if (auto toRead = mContext.getDataMQ()->availableToRead(&fmqError, &fmqErrorMsg);
toRead != 0 && !mContext.getDataMQ()->read(static_cast<int8_t*>(buffer), toRead)) {
ALOGE("%s: failed to read %zu bytes to data MQ", __func__, toRead);
return NOT_ENOUGH_DATA;
}
}
+ LOG_ALWAYS_FATAL_IF(fmqError != StreamContextAidl::DataMQ::Error::NONE,
+ "%s", fmqErrorMsg.c_str());
mStreamPowerLog.log(buffer, *transferred);
return OK;
}