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

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

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: Ibc7c6f87ba19dda040bf15d2ce28276495b50993
This commit is contained in:
Hao Chen 2021-03-11 02:45:03 +00:00 committed by Automerger Merge Worker
commit d7886ba5e2
2 changed files with 16 additions and 4 deletions

View file

@ -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();

View file

@ -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