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 "thread_wrapper.h" 165490a39dSopenharmony_ci#include "intell_voice_log.h" 175490a39dSopenharmony_ci 185490a39dSopenharmony_ci#define LOG_TAG "ThreadWrapper" 195490a39dSopenharmony_ci 205490a39dSopenharmony_cinamespace OHOS { 215490a39dSopenharmony_cinamespace IntellVoiceUtils { 225490a39dSopenharmony_ciThreadWrapper::~ThreadWrapper() 235490a39dSopenharmony_ci{ 245490a39dSopenharmony_ci Join(); 255490a39dSopenharmony_ci} 265490a39dSopenharmony_ci 275490a39dSopenharmony_cibool ThreadWrapper::Start(const std::string &name, TaskQoS qos) 285490a39dSopenharmony_ci{ 295490a39dSopenharmony_ci std::unique_lock uniqueLock(mutex_); 305490a39dSopenharmony_ci if (thread_ != nullptr) { 315490a39dSopenharmony_ci INTELL_VOICE_LOG_WARN("thread is already started, name:%{public}s", name.c_str()); 325490a39dSopenharmony_ci return true; 335490a39dSopenharmony_ci } 345490a39dSopenharmony_ci 355490a39dSopenharmony_ci#ifdef USE_FFRT 365490a39dSopenharmony_ci INTELL_VOICE_LOG_INFO("use ffrt"); 375490a39dSopenharmony_ci thread_ = std::make_unique<ffrt::thread>(name.c_str(), Convert2FfrtQos(qos), &ThreadWrapper::RunInThread, this); 385490a39dSopenharmony_ci#else 395490a39dSopenharmony_ci INTELL_VOICE_LOG_INFO("do not use ffrt"); 405490a39dSopenharmony_ci thread_ = std::make_unique<std::thread>(&ThreadWrapper::RunInThread, this); 415490a39dSopenharmony_ci#endif 425490a39dSopenharmony_ci 435490a39dSopenharmony_ci if (thread_ == nullptr) { 445490a39dSopenharmony_ci INTELL_VOICE_LOG_ERROR("failed to create thread"); 455490a39dSopenharmony_ci return false; 465490a39dSopenharmony_ci } 475490a39dSopenharmony_ci 485490a39dSopenharmony_ci#ifndef USE_FFRT 495490a39dSopenharmony_ci pthread_setname_np(thread_->native_handle(), name.c_str()); 505490a39dSopenharmony_ci#endif 515490a39dSopenharmony_ci return true; 525490a39dSopenharmony_ci} 535490a39dSopenharmony_ci 545490a39dSopenharmony_civoid ThreadWrapper::Join() 555490a39dSopenharmony_ci{ 565490a39dSopenharmony_ci std::unique_lock uniqueLock(mutex_); 575490a39dSopenharmony_ci if (thread_ == nullptr) { 585490a39dSopenharmony_ci return; 595490a39dSopenharmony_ci } 605490a39dSopenharmony_ci if (thread_->joinable()) { 615490a39dSopenharmony_ci uniqueLock.unlock(); 625490a39dSopenharmony_ci thread_->join(); 635490a39dSopenharmony_ci uniqueLock.lock(); 645490a39dSopenharmony_ci } 655490a39dSopenharmony_ci thread_.reset(); 665490a39dSopenharmony_ci} 675490a39dSopenharmony_ci 685490a39dSopenharmony_civoid ThreadWrapper::RunInThread() 695490a39dSopenharmony_ci{ 705490a39dSopenharmony_ci Run(); 715490a39dSopenharmony_ci} 725490a39dSopenharmony_ci 735490a39dSopenharmony_ci#ifdef USE_FFRT 745490a39dSopenharmony_ciffrt::qos ThreadWrapper::Convert2FfrtQos(TaskQoS taskqos) 755490a39dSopenharmony_ci{ 765490a39dSopenharmony_ci switch (taskqos) { 775490a39dSopenharmony_ci case TaskQoS::INHERENT: 785490a39dSopenharmony_ci return ffrt::qos_inherit; 795490a39dSopenharmony_ci case TaskQoS::BACKGROUND: 805490a39dSopenharmony_ci return ffrt::qos_background; 815490a39dSopenharmony_ci case TaskQoS::UTILITY: 825490a39dSopenharmony_ci return ffrt::qos_utility; 835490a39dSopenharmony_ci case TaskQoS::DEFAULT: 845490a39dSopenharmony_ci return ffrt::qos_default; 855490a39dSopenharmony_ci case TaskQoS::USER_INITIATED: 865490a39dSopenharmony_ci return ffrt::qos_user_initiated; 875490a39dSopenharmony_ci case TaskQoS::DEADLINE_REQUEST: 885490a39dSopenharmony_ci return ffrt::qos_deadline_request; 895490a39dSopenharmony_ci case TaskQoS::USER_INTERACTIVE: 905490a39dSopenharmony_ci return ffrt::qos_user_interactive; 915490a39dSopenharmony_ci default: 925490a39dSopenharmony_ci break; 935490a39dSopenharmony_ci } 945490a39dSopenharmony_ci 955490a39dSopenharmony_ci return ffrt::qos_inherit; 965490a39dSopenharmony_ci} 975490a39dSopenharmony_ci#endif 985490a39dSopenharmony_ci} 995490a39dSopenharmony_ci}