diff options
author | Xin Li <delphij@google.com> | 2021-08-14 06:30:57 +0000 |
---|---|---|
committer | Xin Li <delphij@google.com> | 2021-08-14 06:30:57 +0000 |
commit | e287df40b90fe64c226f90c66353a33e8ef40063 (patch) | |
tree | 7c602d9041f18c2a25c6d12ab5b77203e2eeb9f2 /biometrics/fingerprint/aidl/default/WorkerThread.cpp | |
parent | ff81122b948c9169a2c9024f21bd7339acf952f6 (diff) | |
parent | b0fefa2d97288c4087897bd84c4c521f239fd508 (diff) |
Merge sc-dev-plus-aosp-without-vendor@7634622
Merged-In: Ifa71accba7ecf2ab15980227a4413831cfceb187
Change-Id: I7fb44c6c578a51c8ad36649d20a46233fd9609ca
Diffstat (limited to 'biometrics/fingerprint/aidl/default/WorkerThread.cpp')
-rw-r--r-- | biometrics/fingerprint/aidl/default/WorkerThread.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/biometrics/fingerprint/aidl/default/WorkerThread.cpp b/biometrics/fingerprint/aidl/default/WorkerThread.cpp new file mode 100644 index 0000000000..d1a63d07ee --- /dev/null +++ b/biometrics/fingerprint/aidl/default/WorkerThread.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "WorkerThread.h" + +namespace aidl::android::hardware::biometrics::fingerprint { + +// It's important that mThread is initialized after everything else because it runs a member +// function that may use any member of this class. +WorkerThread::WorkerThread(size_t maxQueueSize) + : mMaxSize(maxQueueSize), + mIsDestructing(false), + mQueue(), + mQueueMutex(), + mQueueCond(), + mThread(&WorkerThread::threadFunc, this) {} + +WorkerThread::~WorkerThread() { + // This is a signal for threadFunc to terminate as soon as possible, and a hint for schedule + // that it doesn't need to do any work. + mIsDestructing = true; + mQueueCond.notify_all(); + mThread.join(); +} + +bool WorkerThread::schedule(std::unique_ptr<Callable> task) { + if (mIsDestructing) { + return false; + } + + std::unique_lock<std::mutex> lock(mQueueMutex); + if (mQueue.size() >= mMaxSize) { + return false; + } + mQueue.push_back(std::move(task)); + lock.unlock(); + mQueueCond.notify_one(); + return true; +} + +void WorkerThread::threadFunc() { + while (!mIsDestructing) { + std::unique_lock<std::mutex> lock(mQueueMutex); + mQueueCond.wait(lock, [this] { return !mQueue.empty() || mIsDestructing; }); + if (mIsDestructing) { + return; + } + std::unique_ptr<Callable> task = std::move(mQueue.front()); + mQueue.pop_front(); + lock.unlock(); + (*task)(); + } +} + +} // namespace aidl::android::hardware::biometrics::fingerprint |