119e95205Sopenharmony_ci/* 219e95205Sopenharmony_ci * Copyright (C) 2021-2022 Huawei Device Co., Ltd. 319e95205Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 419e95205Sopenharmony_ci * you may not use this file except in compliance with the License. 519e95205Sopenharmony_ci * You may obtain a copy of the License at 619e95205Sopenharmony_ci * 719e95205Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 819e95205Sopenharmony_ci * 919e95205Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1019e95205Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1119e95205Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1219e95205Sopenharmony_ci * See the License for the specific language governing permissions and 1319e95205Sopenharmony_ci * limitations under the License. 1419e95205Sopenharmony_ci */ 1519e95205Sopenharmony_ci 1619e95205Sopenharmony_ci#ifndef DISPATCHER_H 1719e95205Sopenharmony_ci#define DISPATCHER_H 1819e95205Sopenharmony_ci 1919e95205Sopenharmony_ci#include <atomic> 2019e95205Sopenharmony_ci#include <functional> 2119e95205Sopenharmony_ci#include <future> 2219e95205Sopenharmony_ci#include <memory> 2319e95205Sopenharmony_ci#include <string> 2419e95205Sopenharmony_ci#include <thread> 2519e95205Sopenharmony_ci#include "fixed_queue.h" 2619e95205Sopenharmony_ci 2719e95205Sopenharmony_cinamespace utility { 2819e95205Sopenharmony_ciclass Dispatcher { 2919e95205Sopenharmony_cipublic: 3019e95205Sopenharmony_ci /** 3119e95205Sopenharmony_ci * @brief Construct a new Dispatcher object. 3219e95205Sopenharmony_ci * 3319e95205Sopenharmony_ci * @param name Dispatcher name. 3419e95205Sopenharmony_ci * @since 6 3519e95205Sopenharmony_ci */ 3619e95205Sopenharmony_ci explicit Dispatcher(const std::string &name = "bt-dispatcher"); 3719e95205Sopenharmony_ci 3819e95205Sopenharmony_ci /** 3919e95205Sopenharmony_ci * @brief Destroy the Dispatcher object 4019e95205Sopenharmony_ci * 4119e95205Sopenharmony_ci * @since 6 4219e95205Sopenharmony_ci */ 4319e95205Sopenharmony_ci virtual ~Dispatcher(); 4419e95205Sopenharmony_ci 4519e95205Sopenharmony_ci /** 4619e95205Sopenharmony_ci * @brief Initialize the Dispatcher object 4719e95205Sopenharmony_ci * 4819e95205Sopenharmony_ci * @since 6 4919e95205Sopenharmony_ci */ 5019e95205Sopenharmony_ci void Initialize(); 5119e95205Sopenharmony_ci 5219e95205Sopenharmony_ci /** 5319e95205Sopenharmony_ci * @brief Uninitialize the Dispatcher object 5419e95205Sopenharmony_ci * 5519e95205Sopenharmony_ci * @since 6 5619e95205Sopenharmony_ci */ 5719e95205Sopenharmony_ci void Uninitialize(); 5819e95205Sopenharmony_ci 5919e95205Sopenharmony_ci /** 6019e95205Sopenharmony_ci * @brief PostTask to dispatcher. 6119e95205Sopenharmony_ci * 6219e95205Sopenharmony_ci * @param task 6319e95205Sopenharmony_ci * @since 6 6419e95205Sopenharmony_ci */ 6519e95205Sopenharmony_ci void PostTask(const std::function<void()> &task); 6619e95205Sopenharmony_ci 6719e95205Sopenharmony_ci /** 6819e95205Sopenharmony_ci * @brief Get Dispatcher name. 6919e95205Sopenharmony_ci * 7019e95205Sopenharmony_ci * @return Dispatcher's name. 7119e95205Sopenharmony_ci * @since 6 7219e95205Sopenharmony_ci */ 7319e95205Sopenharmony_ci const std::string &Name() const; 7419e95205Sopenharmony_ci 7519e95205Sopenharmony_ciprivate: 7619e95205Sopenharmony_ci /** 7719e95205Sopenharmony_ci * @brief Run Dispatcher function. 7819e95205Sopenharmony_ci * 7919e95205Sopenharmony_ci * @param dispatcher Dispatcher pointer. 8019e95205Sopenharmony_ci * @since 6 8119e95205Sopenharmony_ci */ 8219e95205Sopenharmony_ci void Run(std::promise<void> promise); 8319e95205Sopenharmony_ci 8419e95205Sopenharmony_ci std::string name_ {""}; 8519e95205Sopenharmony_ci std::mutex mutex_ {}; 8619e95205Sopenharmony_ci std::unique_ptr<std::thread> thread_ {nullptr}; 8719e95205Sopenharmony_ci std::atomic_bool start_ = ATOMIC_FLAG_INIT; 8819e95205Sopenharmony_ci utility::FixedQueue<std::function<void()>> taskQueue_ {}; 8919e95205Sopenharmony_ci 9019e95205Sopenharmony_ci BT_DISALLOW_COPY_AND_ASSIGN(Dispatcher); 9119e95205Sopenharmony_ci}; 9219e95205Sopenharmony_ci} // namespace utility 9319e95205Sopenharmony_ci 9419e95205Sopenharmony_ci#endif // DISPATCHER_H