xref: /aosp_15_r20/system/libhidl/base/include/hidl/TaskRunner.h (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 #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