Start keymaster workers on demand
Test: Keystore CTS tests
Bug: 111443219
Change-Id: I4ca9f67ad197ddc604c20afd28365f64a8587a3b
diff --git a/keystore/keymaster_worker.cpp b/keystore/keymaster_worker.cpp
index 1002b8d..f3bf71f 100644
--- a/keystore/keymaster_worker.cpp
+++ b/keystore/keymaster_worker.cpp
@@ -37,34 +37,31 @@
using android::security::keymaster::operationFailed;
using android::security::keymaster::OperationResult;
-Worker::Worker() {
- worker_ = std::thread([this] {
- std::unique_lock<std::mutex> lock(pending_requests_mutex_);
- running_ = true;
- while (running_) {
- pending_requests_cond_var_.wait(
- lock, [this]() { return !pending_requests_.empty() || !running_; });
- if (!running_) break;
- auto request = std::move(pending_requests_.front());
- pending_requests_.pop();
- lock.unlock();
- request();
- lock.lock();
- }
- });
-}
+Worker::Worker() {}
Worker::~Worker() {
- if (worker_.joinable()) {
- running_ = false;
- pending_requests_cond_var_.notify_all();
- worker_.join();
- }
+ std::unique_lock<std::mutex> lock(pending_requests_mutex_);
+ pending_requests_cond_var_.wait(lock, [this] { return pending_requests_.empty(); });
}
void Worker::addRequest(WorkerTask request) {
std::unique_lock<std::mutex> lock(pending_requests_mutex_);
+ bool start_thread = pending_requests_.empty();
pending_requests_.push(std::move(request));
lock.unlock();
- pending_requests_cond_var_.notify_all();
+ if (start_thread) {
+ auto worker = std::thread([this] {
+ std::unique_lock<std::mutex> lock(pending_requests_mutex_);
+ running_ = true;
+ while (!pending_requests_.empty()) {
+ auto request = std::move(pending_requests_.front());
+ lock.unlock();
+ request();
+ lock.lock();
+ pending_requests_.pop();
+ pending_requests_cond_var_.notify_all();
+ }
+ });
+ worker.detach();
+ }
}
KeymasterWorker::KeymasterWorker(sp<Keymaster> keymasterDevice, KeyStore* keyStore)