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 WorkerTaskRunner::TaskRunner() { 29*8222fbe1SAndroid Build Coastguard Worker } 30*8222fbe1SAndroid Build Coastguard Worker start(size_t limit)31*8222fbe1SAndroid Build Coastguard Workervoid 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 WorkerTaskRunner::~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 Workerbool 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