mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 11:36:00 +00:00
Merge "audio: Fix handling of a thread exit command with a bad cookie" into main am: 759fb98667
Original change: https://android-review.googlesource.com/c/platform/hardware/interfaces/+/2908743 Change-Id: Ib53b2daa933ae42bd64b49e139e9a3ce2057162c Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -180,17 +180,20 @@ StreamInWorkerLogic::Status StreamInWorkerLogic::cycle() {
|
|||||||
StreamDescriptor::Reply reply{};
|
StreamDescriptor::Reply reply{};
|
||||||
reply.status = STATUS_BAD_VALUE;
|
reply.status = STATUS_BAD_VALUE;
|
||||||
switch (command.getTag()) {
|
switch (command.getTag()) {
|
||||||
case Tag::halReservedExit:
|
case Tag::halReservedExit: {
|
||||||
if (const int32_t cookie = command.get<Tag::halReservedExit>();
|
const int32_t cookie = command.get<Tag::halReservedExit>();
|
||||||
cookie == (mContext->getInternalCommandCookie() ^ getTid())) {
|
if (cookie == (mContext->getInternalCommandCookie() ^ getTid())) {
|
||||||
mDriver->shutdown();
|
mDriver->shutdown();
|
||||||
setClosed();
|
setClosed();
|
||||||
// This is an internal command, no need to reply.
|
|
||||||
return Status::EXIT;
|
|
||||||
} else {
|
} else {
|
||||||
LOG(WARNING) << __func__ << ": EXIT command has a bad cookie: " << cookie;
|
LOG(WARNING) << __func__ << ": EXIT command has a bad cookie: " << cookie;
|
||||||
}
|
}
|
||||||
break;
|
if (cookie != 0) { // This is an internal command, no need to reply.
|
||||||
|
return Status::EXIT;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
case Tag::getStatus:
|
case Tag::getStatus:
|
||||||
populateReply(&reply, mIsConnected);
|
populateReply(&reply, mIsConnected);
|
||||||
break;
|
break;
|
||||||
@@ -400,17 +403,20 @@ StreamOutWorkerLogic::Status StreamOutWorkerLogic::cycle() {
|
|||||||
reply.status = STATUS_BAD_VALUE;
|
reply.status = STATUS_BAD_VALUE;
|
||||||
using Tag = StreamDescriptor::Command::Tag;
|
using Tag = StreamDescriptor::Command::Tag;
|
||||||
switch (command.getTag()) {
|
switch (command.getTag()) {
|
||||||
case Tag::halReservedExit:
|
case Tag::halReservedExit: {
|
||||||
if (const int32_t cookie = command.get<Tag::halReservedExit>();
|
const int32_t cookie = command.get<Tag::halReservedExit>();
|
||||||
cookie == (mContext->getInternalCommandCookie() ^ getTid())) {
|
if (cookie == (mContext->getInternalCommandCookie() ^ getTid())) {
|
||||||
mDriver->shutdown();
|
mDriver->shutdown();
|
||||||
setClosed();
|
setClosed();
|
||||||
// This is an internal command, no need to reply.
|
|
||||||
return Status::EXIT;
|
|
||||||
} else {
|
} else {
|
||||||
LOG(WARNING) << __func__ << ": EXIT command has a bad cookie: " << cookie;
|
LOG(WARNING) << __func__ << ": EXIT command has a bad cookie: " << cookie;
|
||||||
}
|
}
|
||||||
break;
|
if (cookie != 0) { // This is an internal command, no need to reply.
|
||||||
|
return Status::EXIT;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
case Tag::getStatus:
|
case Tag::getStatus:
|
||||||
populateReply(&reply, mIsConnected);
|
populateReply(&reply, mIsConnected);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ class StreamContext {
|
|||||||
std::weak_ptr<sounddose::StreamDataProcessorInterface> streamDataProcessor,
|
std::weak_ptr<sounddose::StreamDataProcessorInterface> streamDataProcessor,
|
||||||
DebugParameters debugParameters)
|
DebugParameters debugParameters)
|
||||||
: mCommandMQ(std::move(commandMQ)),
|
: mCommandMQ(std::move(commandMQ)),
|
||||||
mInternalCommandCookie(std::rand()),
|
mInternalCommandCookie(std::rand() | 1 /* make sure it's not 0 */),
|
||||||
mReplyMQ(std::move(replyMQ)),
|
mReplyMQ(std::move(replyMQ)),
|
||||||
mFormat(format),
|
mFormat(format),
|
||||||
mChannelLayout(channelLayout),
|
mChannelLayout(channelLayout),
|
||||||
|
|||||||
Reference in New Issue
Block a user