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#include "task_executor.h" 165490a39dSopenharmony_ci#include <sys/prctl.h> 175490a39dSopenharmony_ci#include "intell_voice_log.h" 185490a39dSopenharmony_ci 195490a39dSopenharmony_ci#define LOG_TAG "TaskExecutor" 205490a39dSopenharmony_ci 215490a39dSopenharmony_cinamespace OHOS { 225490a39dSopenharmony_cinamespace IntellVoiceUtils { 235490a39dSopenharmony_ciTaskExecutor::TaskExecutor(const std::string &threadName, uint32_t capacity) : threadName_(threadName) 245490a39dSopenharmony_ci{ 255490a39dSopenharmony_ci Init(capacity); 265490a39dSopenharmony_ci} 275490a39dSopenharmony_ci 285490a39dSopenharmony_ciTaskExecutor::~TaskExecutor() 295490a39dSopenharmony_ci{ 305490a39dSopenharmony_ci StopThread(); 315490a39dSopenharmony_ci} 325490a39dSopenharmony_ci 335490a39dSopenharmony_civoid TaskExecutor::StartThread() 345490a39dSopenharmony_ci{ 355490a39dSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 365490a39dSopenharmony_ci int ret = pthread_create(&tid_, nullptr, TaskExecutor::ExecuteInThread, this); 375490a39dSopenharmony_ci if (ret != 0) { 385490a39dSopenharmony_ci INTELL_VOICE_LOG_ERROR("create thread failed"); 395490a39dSopenharmony_ci return; 405490a39dSopenharmony_ci } 415490a39dSopenharmony_ci 425490a39dSopenharmony_ci isRuning_ = true; 435490a39dSopenharmony_ci} 445490a39dSopenharmony_ci 455490a39dSopenharmony_civoid TaskExecutor::StopThread() 465490a39dSopenharmony_ci{ 475490a39dSopenharmony_ci Uninit(); 485490a39dSopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 495490a39dSopenharmony_ci if (!isRuning_) { 505490a39dSopenharmony_ci return; 515490a39dSopenharmony_ci } 525490a39dSopenharmony_ci 535490a39dSopenharmony_ci pthread_join(tid_, nullptr); 545490a39dSopenharmony_ci isRuning_ = false; 555490a39dSopenharmony_ci} 565490a39dSopenharmony_ci 575490a39dSopenharmony_civoid *TaskExecutor::ExecuteInThread(void *arg) 585490a39dSopenharmony_ci{ 595490a39dSopenharmony_ci TaskExecutor *executor = static_cast<TaskExecutor *>(arg); 605490a39dSopenharmony_ci if (executor == nullptr) { 615490a39dSopenharmony_ci INTELL_VOICE_LOG_ERROR("executor is nullptr"); 625490a39dSopenharmony_ci return nullptr; 635490a39dSopenharmony_ci } 645490a39dSopenharmony_ci prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(executor->threadName_.c_str()), 0, 0, 0); 655490a39dSopenharmony_ci do { 665490a39dSopenharmony_ci std::function<void()> task; 675490a39dSopenharmony_ci if (!executor->Pop(task)) { 685490a39dSopenharmony_ci INTELL_VOICE_LOG_INFO("no task needed to execute"); 695490a39dSopenharmony_ci break; 705490a39dSopenharmony_ci } 715490a39dSopenharmony_ci task(); 725490a39dSopenharmony_ci } while (1); 735490a39dSopenharmony_ci return nullptr; 745490a39dSopenharmony_ci} 755490a39dSopenharmony_ci} 765490a39dSopenharmony_ci}