Merge "BLASTBufferQueue: Correct deadlocks in mNextTransaction handling."
diff --git a/libs/gui/BLASTBufferQueue.cpp b/libs/gui/BLASTBufferQueue.cpp
index 02416e4..acd833f 100644
--- a/libs/gui/BLASTBufferQueue.cpp
+++ b/libs/gui/BLASTBufferQueue.cpp
@@ -180,9 +180,9 @@
}
mPendingReleaseItem.item = std::move(mSubmitted.front());
mSubmitted.pop();
- if (mNextTransaction == nullptr) {
- processNextBufferLocked();
- }
+
+ processNextBufferLocked();
+
mCallbackCV.notify_all();
decStrong((void*)transactionCallbackThunk);
}
@@ -201,7 +201,7 @@
SurfaceComposerClient::Transaction localTransaction;
bool applyTransaction = true;
SurfaceComposerClient::Transaction* t = &localTransaction;
- if (mNextTransaction != nullptr) {
+ if (mNextTransaction != nullptr && mUseNextTransaction) {
t = mNextTransaction;
mNextTransaction = nullptr;
applyTransaction = false;
@@ -263,9 +263,10 @@
std::unique_lock _lock{mMutex};
if (mNextTransaction != nullptr) {
- while (mNumFrameAvailable > 0 || mNumAcquired == MAX_ACQUIRED_BUFFERS) {
+ while (mNumFrameAvailable > 0 || mNumAcquired == MAX_ACQUIRED_BUFFERS + 1) {
mCallbackCV.wait(_lock);
}
+ mUseNextTransaction = true;
}
// add to shadow queue
mNumFrameAvailable++;
@@ -274,6 +275,7 @@
void BLASTBufferQueue::setNextTransaction(SurfaceComposerClient::Transaction* t) {
std::lock_guard _lock{mMutex};
+ mUseNextTransaction = false;
mNextTransaction = t;
}
diff --git a/libs/gui/include/gui/BLASTBufferQueue.h b/libs/gui/include/gui/BLASTBufferQueue.h
index 1b22df2..64c21e0 100644
--- a/libs/gui/include/gui/BLASTBufferQueue.h
+++ b/libs/gui/include/gui/BLASTBufferQueue.h
@@ -123,6 +123,8 @@
sp<BLASTBufferItemConsumer> mBufferItemConsumer;
SurfaceComposerClient::Transaction* mNextTransaction GUARDED_BY(mMutex);
+
+ bool mUseNextTransaction = false;
};
} // namespace android