| /* | |
| * Copyright (C) 2016 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #ifndef ANDROID_HIDL_TASK_RUNNER_H | |
| #define ANDROID_HIDL_TASK_RUNNER_H | |
| #include <functional> | |
| #include <memory> | |
| #include <thread> | |
| namespace android { | |
| namespace hardware { | |
| namespace details { | |
| using Task = std::function<void(void)>; | |
| template <typename T> | |
| struct SynchronizedQueue; | |
| /* | |
| * A background infinite loop that runs the Tasks push()'ed. | |
| * Equivalent to a simple single-threaded Looper. | |
| */ | |
| class TaskRunner { | |
| public: | |
| /* Create an empty task runner. Nothing will be done until start() is called. */ | |
| TaskRunner(); | |
| /* | |
| * Notify the background thread to terminate and return immediately. | |
| * Tasks in the queue will continue to be done sequentially in background | |
| * until all tasks are finished. | |
| */ | |
| ~TaskRunner(); | |
| /* | |
| * Sets the queue limit. Fails the push operation once the limit is reached. | |
| * This function is named start for legacy reasons and to maintain ABI | |
| * stability, but the underlying thread running tasks isn't started until | |
| * the first task is pushed. | |
| */ | |
| void start(size_t limit); | |
| /* | |
| * Add a task. Return true if successful, false if | |
| * the queue's size exceeds limit or t doesn't contain a callable target. | |
| */ | |
| bool push(const Task &t); | |
| private: | |
| std::shared_ptr<SynchronizedQueue<Task>> mQueue; | |
| }; | |
| } // namespace details | |
| } // namespace hardware | |
| } // namespace android | |
| #endif // ANDROID_HIDL_TASK_RUNNER_H |