xref: /aosp_15_r20/system/libhidl/base/TaskRunner.cpp (revision 8222fbe171c3d6fadfe95119c180cf3010c392a8)
1*8222fbe1SAndroid Build Coastguard Worker /*
2*8222fbe1SAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*8222fbe1SAndroid Build Coastguard Worker  *
4*8222fbe1SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*8222fbe1SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*8222fbe1SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*8222fbe1SAndroid Build Coastguard Worker  *
8*8222fbe1SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*8222fbe1SAndroid Build Coastguard Worker  *
10*8222fbe1SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*8222fbe1SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*8222fbe1SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8222fbe1SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*8222fbe1SAndroid Build Coastguard Worker  * limitations under the License.
15*8222fbe1SAndroid Build Coastguard Worker  */
16*8222fbe1SAndroid Build Coastguard Worker 
17*8222fbe1SAndroid Build Coastguard Worker #include <hidl/TaskRunner.h>
18*8222fbe1SAndroid Build Coastguard Worker 
19*8222fbe1SAndroid Build Coastguard Worker #include <utils/AndroidThreads.h>
20*8222fbe1SAndroid Build Coastguard Worker #include "SynchronizedQueue.h"
21*8222fbe1SAndroid Build Coastguard Worker 
22*8222fbe1SAndroid Build Coastguard Worker #include <thread>
23*8222fbe1SAndroid Build Coastguard Worker 
24*8222fbe1SAndroid Build Coastguard Worker namespace android {
25*8222fbe1SAndroid Build Coastguard Worker namespace hardware {
26*8222fbe1SAndroid Build Coastguard Worker namespace details {
27*8222fbe1SAndroid Build Coastguard Worker 
TaskRunner()28*8222fbe1SAndroid Build Coastguard Worker TaskRunner::TaskRunner() {
29*8222fbe1SAndroid Build Coastguard Worker }
30*8222fbe1SAndroid Build Coastguard Worker 
start(size_t limit)31*8222fbe1SAndroid Build Coastguard Worker void TaskRunner::start(size_t limit) {
32*8222fbe1SAndroid Build Coastguard Worker     mQueue = std::make_shared<SynchronizedQueue<Task>>(limit);
33*8222fbe1SAndroid Build Coastguard Worker }
34*8222fbe1SAndroid Build Coastguard Worker 
~TaskRunner()35*8222fbe1SAndroid Build Coastguard Worker TaskRunner::~TaskRunner() {
36*8222fbe1SAndroid Build Coastguard Worker     if (mQueue) {
37*8222fbe1SAndroid Build Coastguard Worker         mQueue->push(nullptr);
38*8222fbe1SAndroid Build Coastguard Worker     }
39*8222fbe1SAndroid Build Coastguard Worker }
40*8222fbe1SAndroid Build Coastguard Worker 
push(const Task & t)41*8222fbe1SAndroid Build Coastguard Worker bool TaskRunner::push(const Task &t) {
42*8222fbe1SAndroid Build Coastguard Worker     if (mQueue == nullptr || !t) {
43*8222fbe1SAndroid Build Coastguard Worker         return false;
44*8222fbe1SAndroid Build Coastguard Worker     }
45*8222fbe1SAndroid Build Coastguard Worker 
46*8222fbe1SAndroid Build Coastguard Worker     {
47*8222fbe1SAndroid Build Coastguard Worker         std::unique_lock<std::mutex> lock = mQueue->lock();
48*8222fbe1SAndroid Build Coastguard Worker 
49*8222fbe1SAndroid Build Coastguard Worker         if (!mQueue->isInitializedLocked()) {
50*8222fbe1SAndroid Build Coastguard Worker             // Allow the thread to continue running in background;
51*8222fbe1SAndroid Build Coastguard Worker             // TaskRunner do not care about the std::thread object.
52*8222fbe1SAndroid Build Coastguard Worker             std::thread{[q = mQueue] {
53*8222fbe1SAndroid Build Coastguard Worker                 androidSetThreadName("HIDL TaskRunner");
54*8222fbe1SAndroid Build Coastguard Worker 
55*8222fbe1SAndroid Build Coastguard Worker                 Task nextTask;
56*8222fbe1SAndroid Build Coastguard Worker                 while (!!(nextTask = q->wait_pop())) {
57*8222fbe1SAndroid Build Coastguard Worker                     nextTask();
58*8222fbe1SAndroid Build Coastguard Worker                 }
59*8222fbe1SAndroid Build Coastguard Worker             }}.detach();
60*8222fbe1SAndroid Build Coastguard Worker 
61*8222fbe1SAndroid Build Coastguard Worker             mQueue->setInitializedLocked(true);
62*8222fbe1SAndroid Build Coastguard Worker         }
63*8222fbe1SAndroid Build Coastguard Worker     }
64*8222fbe1SAndroid Build Coastguard Worker 
65*8222fbe1SAndroid Build Coastguard Worker     return this->mQueue->push(t);
66*8222fbe1SAndroid Build Coastguard Worker }
67*8222fbe1SAndroid Build Coastguard Worker 
68*8222fbe1SAndroid Build Coastguard Worker } // namespace details
69*8222fbe1SAndroid Build Coastguard Worker } // namespace hardware
70*8222fbe1SAndroid Build Coastguard Worker } // namespace android
71*8222fbe1SAndroid Build Coastguard Worker 
72