diff options
author | Alec Mouri <alecmouri@google.com> | 2021-08-19 16:52:34 -0700 |
---|---|---|
committer | Ady Abraham <adyabr@google.com> | 2021-08-31 21:22:57 +0000 |
commit | 5c8b18c90806307939fd44c57855621ab004af8a (patch) | |
tree | eb969890954c4a049b3967c87b5c3748fee1a376 | |
parent | 66a59c3ebfa3572f11758731cda7296541767b5e (diff) | |
download | native-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.cpp | 4 | ||||
-rw-r--r-- | libs/gui/include/gui/BLASTBufferQueue.h | 3 |
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 |