BLASTBufferQueue: fix AsyncWorker race condition
Address the following scenario:
[T1] AsyncProducerListener::onBufferReleased() is called
for the first time.
[T2] AsyncWorker::mThread is just created and not acquired
the mutex yet.
[T1] AsyncProducerListener::post() is called and acquired the mutex.
[T1] The runnable is queued to mRunnable and mCv is notified.
There are no threads waiting for mCv, so this is ignored.
[T2] AsyncWorker::mThread acquires the mutex, and wait on mCv.
If the client is waiting for the first onBufferReleased callback,
it will be stuck indefinitely.
Bug: 186630119
Test: atest --iterations 100 android.media.cts.MediaSyncTest
Change-Id: I65d98d64233fa8d488788319a4850be4cace48cc
diff --git a/libs/gui/BLASTBufferQueue.cpp b/libs/gui/BLASTBufferQueue.cpp
index 3d854c2..37fb844 100644
--- a/libs/gui/BLASTBufferQueue.cpp
+++ b/libs/gui/BLASTBufferQueue.cpp
@@ -666,12 +666,12 @@
void run() {
std::unique_lock<std::mutex> lock(mMutex);
while (!mDone) {
- mCv.wait(lock);
while (!mRunnables.empty()) {
std::function<void()> runnable = mRunnables.front();
mRunnables.pop_front();
runnable();
}
+ mCv.wait(lock);
}
}