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