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}