15490a39dSopenharmony_ci/*
25490a39dSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
35490a39dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
45490a39dSopenharmony_ci * you may not use this file except in compliance with the License.
55490a39dSopenharmony_ci * You may obtain a copy of the License at
65490a39dSopenharmony_ci *
75490a39dSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
85490a39dSopenharmony_ci *
95490a39dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
105490a39dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
115490a39dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
125490a39dSopenharmony_ci * See the License for the specific language governing permissions and
135490a39dSopenharmony_ci * limitations under the License.
145490a39dSopenharmony_ci */
155490a39dSopenharmony_ci#ifndef INTELL_VOICE_TASK_EXECUTOR_H
165490a39dSopenharmony_ci#define INTELL_VOICE_TASK_EXECUTOR_H
175490a39dSopenharmony_ci#include <mutex>
185490a39dSopenharmony_ci#include <thread>
195490a39dSopenharmony_ci#include <memory>
205490a39dSopenharmony_ci#include <functional>
215490a39dSopenharmony_ci#include <future>
225490a39dSopenharmony_ci#include <pthread.h>
235490a39dSopenharmony_ci#include <sys/types.h>
245490a39dSopenharmony_ci#include "queue_util.h"
255490a39dSopenharmony_ci
265490a39dSopenharmony_cinamespace OHOS {
275490a39dSopenharmony_cinamespace IntellVoiceUtils {
285490a39dSopenharmony_ciclass TaskExecutor : private QueueUtil<std::function<void()>> {
295490a39dSopenharmony_cipublic:
305490a39dSopenharmony_ci    TaskExecutor(const std::string &threadName, uint32_t capacity);
315490a39dSopenharmony_ci    ~TaskExecutor();
325490a39dSopenharmony_ci    void StartThread();
335490a39dSopenharmony_ci    void StopThread();
345490a39dSopenharmony_ci    template <typename F>
355490a39dSopenharmony_ci    void AddAsyncTask(F &&func)
365490a39dSopenharmony_ci    {
375490a39dSopenharmony_ci        auto task = std::make_shared<std::packaged_task<void()>>(std::forward<F>(func));
385490a39dSopenharmony_ci        Push([task]() { (*task)(); });
395490a39dSopenharmony_ci    }
405490a39dSopenharmony_ci    template <typename F, typename... Args>
415490a39dSopenharmony_ci    auto AddSyncTask(F &&func, Args &&...args) -> decltype(func(args...))
425490a39dSopenharmony_ci    {
435490a39dSopenharmony_ci        auto task = std::make_shared<std::packaged_task<decltype(func(args...))()>>(std::bind(
445490a39dSopenharmony_ci            std::forward<F>(func), std::forward<Args>(args)...));
455490a39dSopenharmony_ci        auto ret = task->get_future();
465490a39dSopenharmony_ci        Push([task]() { (*task)(); });
475490a39dSopenharmony_ci
485490a39dSopenharmony_ci        ret.wait();
495490a39dSopenharmony_ci        return ret.get();
505490a39dSopenharmony_ci    }
515490a39dSopenharmony_ci
525490a39dSopenharmony_ciprivate:
535490a39dSopenharmony_ci    static void *ExecuteInThread(void *arg);
545490a39dSopenharmony_ci
555490a39dSopenharmony_ciprivate:
565490a39dSopenharmony_ci    std::mutex mutex_;
575490a39dSopenharmony_ci    std::string threadName_;
585490a39dSopenharmony_ci    pthread_t tid_ = 0;
595490a39dSopenharmony_ci    bool isRuning_ = false;
605490a39dSopenharmony_ci};
615490a39dSopenharmony_ci}
625490a39dSopenharmony_ci}
635490a39dSopenharmony_ci#endif