Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c8069856 authored by Lais Andrade's avatar Lais Andrade
Browse files

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
parent 3e48aa43
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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());
        }
    }
}
+5 −3
Original line number Diff line number Diff line
@@ -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);
        {
            std::lock_guard<std::mutex> lock(mMutex);
            mCount += 1;
        }
        mCondVar.notify_all();
    }