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

Commit a0cbb80f authored by Hao Chen's avatar Hao Chen
Browse files

Gracefully stop the GeneratorHub worker thread in destructor

To unit test the virtualized VHAL, GeneratorHub needs to be destructable

Test: run unit tests in pa/1878260
Bug: 181371253
Change-Id: Icfd3007a194da7ade037e359858b3dd48f24a0d6
parent b2bb9879
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