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 #ifndef ANDROID_HIDL_TASK_RUNNER_H 17*8222fbe1SAndroid Build Coastguard Worker #define ANDROID_HIDL_TASK_RUNNER_H 18*8222fbe1SAndroid Build Coastguard Worker 19*8222fbe1SAndroid Build Coastguard Worker #include <functional> 20*8222fbe1SAndroid Build Coastguard Worker #include <memory> 21*8222fbe1SAndroid Build Coastguard Worker #include <thread> 22*8222fbe1SAndroid Build Coastguard Worker 23*8222fbe1SAndroid Build Coastguard Worker namespace android { 24*8222fbe1SAndroid Build Coastguard Worker namespace hardware { 25*8222fbe1SAndroid Build Coastguard Worker namespace details { 26*8222fbe1SAndroid Build Coastguard Worker 27*8222fbe1SAndroid Build Coastguard Worker using Task = std::function<void(void)>; 28*8222fbe1SAndroid Build Coastguard Worker 29*8222fbe1SAndroid Build Coastguard Worker template <typename T> 30*8222fbe1SAndroid Build Coastguard Worker struct SynchronizedQueue; 31*8222fbe1SAndroid Build Coastguard Worker 32*8222fbe1SAndroid Build Coastguard Worker /* 33*8222fbe1SAndroid Build Coastguard Worker * A background infinite loop that runs the Tasks push()'ed. 34*8222fbe1SAndroid Build Coastguard Worker * Equivalent to a simple single-threaded Looper. 35*8222fbe1SAndroid Build Coastguard Worker */ 36*8222fbe1SAndroid Build Coastguard Worker class TaskRunner { 37*8222fbe1SAndroid Build Coastguard Worker public: 38*8222fbe1SAndroid Build Coastguard Worker 39*8222fbe1SAndroid Build Coastguard Worker /* Create an empty task runner. Nothing will be done until start() is called. */ 40*8222fbe1SAndroid Build Coastguard Worker TaskRunner(); 41*8222fbe1SAndroid Build Coastguard Worker 42*8222fbe1SAndroid Build Coastguard Worker /* 43*8222fbe1SAndroid Build Coastguard Worker * Notify the background thread to terminate and return immediately. 44*8222fbe1SAndroid Build Coastguard Worker * Tasks in the queue will continue to be done sequentially in background 45*8222fbe1SAndroid Build Coastguard Worker * until all tasks are finished. 46*8222fbe1SAndroid Build Coastguard Worker */ 47*8222fbe1SAndroid Build Coastguard Worker ~TaskRunner(); 48*8222fbe1SAndroid Build Coastguard Worker 49*8222fbe1SAndroid Build Coastguard Worker /* 50*8222fbe1SAndroid Build Coastguard Worker * Sets the queue limit. Fails the push operation once the limit is reached. 51*8222fbe1SAndroid Build Coastguard Worker * This function is named start for legacy reasons and to maintain ABI 52*8222fbe1SAndroid Build Coastguard Worker * stability, but the underlying thread running tasks isn't started until 53*8222fbe1SAndroid Build Coastguard Worker * the first task is pushed. 54*8222fbe1SAndroid Build Coastguard Worker */ 55*8222fbe1SAndroid Build Coastguard Worker void start(size_t limit); 56*8222fbe1SAndroid Build Coastguard Worker 57*8222fbe1SAndroid Build Coastguard Worker /* 58*8222fbe1SAndroid Build Coastguard Worker * Add a task. Return true if successful, false if 59*8222fbe1SAndroid Build Coastguard Worker * the queue's size exceeds limit or t doesn't contain a callable target. 60*8222fbe1SAndroid Build Coastguard Worker */ 61*8222fbe1SAndroid Build Coastguard Worker bool push(const Task &t); 62*8222fbe1SAndroid Build Coastguard Worker 63*8222fbe1SAndroid Build Coastguard Worker private: 64*8222fbe1SAndroid Build Coastguard Worker std::shared_ptr<SynchronizedQueue<Task>> mQueue; 65*8222fbe1SAndroid Build Coastguard Worker }; 66*8222fbe1SAndroid Build Coastguard Worker 67*8222fbe1SAndroid Build Coastguard Worker } // namespace details 68*8222fbe1SAndroid Build Coastguard Worker } // namespace hardware 69*8222fbe1SAndroid Build Coastguard Worker } // namespace android 70*8222fbe1SAndroid Build Coastguard Worker 71*8222fbe1SAndroid Build Coastguard Worker #endif // ANDROID_HIDL_TASK_RUNNER_H 72