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

Commit d7886ba5 authored by Hao Chen's avatar Hao Chen Committed by Automerger Merge Worker
Browse files

Merge "Gracefully stop the GeneratorHub worker thread in destructor" into...

Merge "Gracefully stop the GeneratorHub worker thread in destructor" into rvc-qpr-dev am: a216f7fa am: d8c5052c

Original change: https://googleplex-android-review.googlesource.com/c/platform/hardware/interfaces/+/13807297

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: Ibc7c6f87ba19dda040bf15d2ce28276495b50993
parents 72a30a0f d8c5052c
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -31,6 +31,14 @@ namespace impl {
GeneratorHub::GeneratorHub(const OnHalEvent& onHalEvent)
    : mOnHalEvent(onHalEvent), mThread(&GeneratorHub::run, this) {}

GeneratorHub::~GeneratorHub() {
    mShuttingDownFlag.store(true);
    mCond.notify_all();
    if (mThread.joinable()) {
        mThread.join();
    }
}

void GeneratorHub::registerGenerator(int32_t cookie, FakeValueGeneratorPtr generator) {
    {
        std::lock_guard<std::mutex> g(mLock);
@@ -58,15 +66,18 @@ void GeneratorHub::unregisterGenerator(int32_t cookie) {
}

void GeneratorHub::run() {
    while (true) {
    while (!mShuttingDownFlag.load()) {
        std::unique_lock<std::mutex> g(mLock);
        // Pop events whose generator does not exist (may be already unregistered)
        while (!mEventQueue.empty()
               && mGenerators.find(mEventQueue.top().cookie) == mGenerators.end()) {
             mEventQueue.pop();
        }
        // Wait until event queue is not empty
        mCond.wait(g, [this] { return !mEventQueue.empty(); });
        // Wait until event queue is not empty or shutting down flag is set
        mCond.wait(g, [this] { return !mEventQueue.empty() || mShuttingDownFlag.load(); });
        if (mShuttingDownFlag.load()) {
            break;
        }

        const VhalEvent& curEvent = mEventQueue.top();

+2 −1
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@ private:

public:
    GeneratorHub(const OnHalEvent& onHalEvent);
    ~GeneratorHub() = default;
    ~GeneratorHub();

    /**
     * Register a new generator. The generator will be discarded if it could not produce next event.
@@ -84,6 +84,7 @@ private:
    mutable std::mutex mLock;
    std::condition_variable mCond;
    std::thread mThread;
    std::atomic<bool> mShuttingDownFlag{false};
};

}  // namespace impl