From 916410f1b110b420736c820970e2fdb7e8ab7900 Mon Sep 17 00:00:00 2001 From: Ilya Matyukhin Date: Wed, 9 Jun 2021 17:52:35 -0700 Subject: [PATCH] Deflake WorkerThreadTest Bug: 187402940 Test: atest --host --rerun-until-failure 1000 WorkerThreadTest Change-Id: I65dc183d7a616a684a42a3780b32f6f8f55ae9c4 --- .../aidl/default/tests/WorkerThreadTest.cpp | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/biometrics/fingerprint/aidl/default/tests/WorkerThreadTest.cpp b/biometrics/fingerprint/aidl/default/tests/WorkerThreadTest.cpp index 84433364df..b2417bd242 100644 --- a/biometrics/fingerprint/aidl/default/tests/WorkerThreadTest.cpp +++ b/biometrics/fingerprint/aidl/default/tests/WorkerThreadTest.cpp @@ -73,24 +73,29 @@ TEST(WorkerThreadTest, TasksExecuteInOrder) { constexpr int NUM_TASKS = 10000; WorkerThread worker(NUM_TASKS); + std::mutex mut; + std::condition_variable cv; + bool finished = false; std::vector results; + for (int i = 0; i < NUM_TASKS; ++i) { - worker.schedule(Callable::from([&results, i] { + worker.schedule(Callable::from([&mut, &results, i] { // Delay tasks differently to provoke races. std::this_thread::sleep_for(std::chrono::nanoseconds(100 - i % 100)); - // Unguarded write to results to provoke races. + auto lock = std::lock_guard(mut); results.push_back(i); })); } - std::promise promise; - auto future = promise.get_future(); - // Schedule a special task to signal when all of the tasks are finished. - worker.schedule( - Callable::from([promise = std::move(promise)]() mutable { promise.set_value(); })); - future.wait(); + worker.schedule(Callable::from([&mut, &cv, &finished] { + auto lock = std::lock_guard(mut); + finished = true; + cv.notify_one(); + })); + auto lock = std::unique_lock(mut); + cv.wait(lock, [&finished] { return finished; }); ASSERT_EQ(results.size(), NUM_TASKS); EXPECT_TRUE(std::is_sorted(results.begin(), results.end())); }