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

Commit dc7f00b8 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 am: d7886ba5

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

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: If78cb71e128bb462f9fb42a778e4ad3071d13983
parents 2dc4eb8a d7886ba5
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