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