Fix flaky GNSS VTS
In the original code, vector::erase() would invalidate iterators so we
should move the thread object into the std::async() for the blocking
operation.
Bug: 344250967
Test: atest VtsHalGnssTargetTest
Change-Id: I4cc82131bb070a37cb6ed9dbe9d7cccc7ab5ee89
diff --git a/gnss/aidl/default/GnssNavigationMessageInterface.cpp b/gnss/aidl/default/GnssNavigationMessageInterface.cpp
index c262dc6..eb1d655 100644
--- a/gnss/aidl/default/GnssNavigationMessageInterface.cpp
+++ b/gnss/aidl/default/GnssNavigationMessageInterface.cpp
@@ -90,15 +90,18 @@
ALOGD("stop");
mIsActive = false;
mThreadBlocker.notify();
- for (auto iter = mThreads.begin(); iter != mThreads.end(); ++iter) {
+ for (auto iter = mThreads.begin(); iter != mThreads.end();) {
if (iter->joinable()) {
- mFutures.push_back(std::async(std::launch::async, [this, iter] {
- iter->join();
- mThreads.erase(iter);
- }));
- } else {
- mThreads.erase(iter);
+ // Store the thread object by value
+ std::thread threadToMove = std::move(*iter);
+
+ mFutures.push_back(std::async(std::launch::async,
+ [threadToMove = std::move(threadToMove)]() mutable {
+ ALOGD("joining thread");
+ threadToMove.join();
+ }));
}
+ iter = mThreads.erase(iter);
}
}