summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlec Mouri <alecmouri@google.com>2021-08-19 16:52:34 -0700
committerAdy Abraham <adyabr@google.com>2021-08-31 21:22:57 +0000
commit5c8b18c90806307939fd44c57855621ab004af8a (patch)
treeeb969890954c4a049b3967c87b5c3748fee1a376
parent66a59c3ebfa3572f11758731cda7296541767b5e (diff)
downloadnative-5c8b18c90806307939fd44c57855621ab004af8a.tar.gz
Use a separate mutex for BLASTBufferQueue in BLASTBufferItemConsumer
Avoids the following deadlock... Thread 1: * BLASTBufferQueue::transactionCallback acquires BLASTBufferQueue::mMutex * BLASTBufferItemConsumer::updateFrameTimestamps waits to acquire BLASTBufferItemConsumer::mMutex Thread 2: * BLASTBufferItemConsumer::onSidebandStreamChanged acquires BLASTBufferItemConsumer::mMutex * BLASTBufferQueue::setSidebandStream tries to acquire BLASTBufferQueue::mMutex Bug: 192998815 Test: Both CTS Media and Mediav2 (by partner) Change-Id: I37523031841db3f1a29481bbfa76d6c028a6942e
-rw-r--r--libs/gui/BLASTBufferQueue.cpp4
-rw-r--r--libs/gui/include/gui/BLASTBufferQueue.h3
2 files changed, 4 insertions, 3 deletions
diff --git a/libs/gui/BLASTBufferQueue.cpp b/libs/gui/BLASTBufferQueue.cpp
index 56a9683773..d860f30617 100644
--- a/libs/gui/BLASTBufferQueue.cpp
+++ b/libs/gui/BLASTBufferQueue.cpp
@@ -118,12 +118,12 @@ void BLASTBufferItemConsumer::getConnectionEvents(uint64_t frameNumber, bool* ne
}
void BLASTBufferItemConsumer::setBlastBufferQueue(BLASTBufferQueue* blastbufferqueue) {
- Mutex::Autolock lock(mMutex);
+ std::scoped_lock lock(mBufferQueueMutex);
mBLASTBufferQueue = blastbufferqueue;
}
void BLASTBufferItemConsumer::onSidebandStreamChanged() {
- Mutex::Autolock lock(mMutex);
+ std::scoped_lock lock(mBufferQueueMutex);
if (mBLASTBufferQueue != nullptr) {
sp<NativeHandle> stream = getSidebandStream();
mBLASTBufferQueue->setSidebandStream(stream);
diff --git a/libs/gui/include/gui/BLASTBufferQueue.h b/libs/gui/include/gui/BLASTBufferQueue.h
index ea9b1c68af..6c5b2aa53c 100644
--- a/libs/gui/include/gui/BLASTBufferQueue.h
+++ b/libs/gui/include/gui/BLASTBufferQueue.h
@@ -62,11 +62,12 @@ private:
uint64_t mCurrentFrameNumber = 0;
Mutex mMutex;
+ std::mutex mBufferQueueMutex;
ConsumerFrameEventHistory mFrameEventHistory GUARDED_BY(mMutex);
std::queue<uint64_t> mDisconnectEvents GUARDED_BY(mMutex);
bool mCurrentlyConnected GUARDED_BY(mMutex);
bool mPreviouslyConnected GUARDED_BY(mMutex);
- BLASTBufferQueue* mBLASTBufferQueue GUARDED_BY(mMutex);
+ BLASTBufferQueue* mBLASTBufferQueue GUARDED_BY(mBufferQueueMutex);
};
class BLASTBufferQueue