diff options
author | 2024-04-26 14:57:13 +0100 | |
---|---|---|
committer | 2024-04-26 15:03:07 +0100 | |
commit | c8069856c3bd0286986651fc5a8e58dbfcc3e7f5 (patch) | |
tree | 455d4ea49f0167663a89d419b1427f916a07f8ce /services/vibratorservice | |
parent | 3e48aa434d0c6a5813ea7e8e2b7b547deb1c9a36 (diff) |
Fix VibratorCallbackScheduler destructor lock
The VibratorCallbackScheduler destructor joins on the scheduler
thread to wait for the main loop to finish, but the conditional variable
is waiting indefinitely without a predicate, which can cause it
sometimes to miss the notify call from the destructor and get stuck.
Adding a predicate condition fixes the VibratorCallbackSchedulerTest
flakiness for the timeout "No test results." failures.
Bug: 293603710
Bug: 293623689
Test: atest --rerun-until-failure 1000 VibratorCallbackSchedulerTest
Change-Id: Id9501c10fe5209003d9b74b0f39f2bcf87de05c2
Diffstat (limited to 'services/vibratorservice')
-rw-r--r-- | services/vibratorservice/VibratorCallbackScheduler.cpp | 8 | ||||
-rw-r--r-- | services/vibratorservice/test/test_utils.h | 8 |
2 files changed, 9 insertions, 7 deletions
diff --git a/services/vibratorservice/VibratorCallbackScheduler.cpp b/services/vibratorservice/VibratorCallbackScheduler.cpp index 7eda9ef0c7..b2b1988d97 100644 --- a/services/vibratorservice/VibratorCallbackScheduler.cpp +++ b/services/vibratorservice/VibratorCallbackScheduler.cpp @@ -87,13 +87,13 @@ void CallbackScheduler::loop() { lock.lock(); } if (mQueue.empty()) { - // Wait until a new callback is scheduled. - mCondition.wait(mMutex); + // Wait until a new callback is scheduled or destructor was called. + mCondition.wait(lock, [this] { return mFinished || !mQueue.empty(); }); } else { - // Wait until next callback expires, or a new one is scheduled. + // Wait until next callback expires or a new one is scheduled. // Use the monotonic steady clock to wait for the measured delay interval via wait_for // instead of using a wall clock via wait_until. - mCondition.wait_for(mMutex, mQueue.top().getWaitForExpirationDuration()); + mCondition.wait_for(lock, mQueue.top().getWaitForExpirationDuration()); } } } diff --git a/services/vibratorservice/test/test_utils.h b/services/vibratorservice/test/test_utils.h index bf13aa7487..715c2215c4 100644 --- a/services/vibratorservice/test/test_utils.h +++ b/services/vibratorservice/test/test_utils.h @@ -90,13 +90,15 @@ public: TestCounter(int32_t init = 0) : mMutex(), mCondVar(), mCount(init) {} int32_t get() { - std::unique_lock<std::mutex> lock(mMutex); + std::lock_guard<std::mutex> lock(mMutex); return mCount; } void increment() { - std::unique_lock<std::mutex> lock(mMutex); - mCount += 1; + { + std::lock_guard<std::mutex> lock(mMutex); + mCount += 1; + } mCondVar.notify_all(); } |