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

Commit d8c5052c 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

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

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: Ief26f8e46deb909c132bc5c4053dab6e630eaf9e
parents 0766acc5 a216f7fa
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