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

Commit 55c97d7e authored by Lais Andrade's avatar Lais Andrade
Browse files

Fix flaky libvibratorservice benchmarks

Add lock around HAL completion callbacks to avoid race conditions with
the test execution.

Bug: 329175148
Test: atest libvibratorservice_benchmarks
Change-Id: I9e9461a37a601e48df8217669c642ad83efac948
parent f1e1e4ba
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -67,6 +67,7 @@ private:
class HalCallbacks {
public:
    HalCallback next() {
        std::unique_lock<std::mutex> lock(mMutex);
        auto id = mCurrentId++;
        mPendingPromises[id] = std::promise<void>();
        mPendingFutures[id] = mPendingPromises[id].get_future(); // Can only be called once.
@@ -74,8 +75,12 @@ public:
    }

    void onComplete(int32_t id) {
        mPendingPromises[id].set_value();
        mPendingPromises.erase(id);
        std::unique_lock<std::mutex> lock(mMutex);
        auto promise = mPendingPromises.find(id);
        if (promise != mPendingPromises.end()) {
            promise->second.set_value();
            mPendingPromises.erase(promise);
        }
    }

    void waitForComplete(int32_t id) {
@@ -94,11 +99,15 @@ public:
            future.wait_for(VIBRATION_CALLBACK_TIMEOUT);
        }
        mPendingFutures.clear();
        {
            std::unique_lock<std::mutex> lock(mMutex);
            mPendingPromises.clear();
        }
    }

private:
    std::map<int32_t, std::promise<void>> mPendingPromises;
    std::mutex mMutex;
    std::map<int32_t, std::promise<void>> mPendingPromises GUARDED_BY(mMutex);
    std::map<int32_t, std::future<void>> mPendingFutures;
    int32_t mCurrentId;
};