1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "thread_wrapper.h"
16 #include "intell_voice_log.h"
17 
18 #define LOG_TAG "ThreadWrapper"
19 
20 namespace OHOS {
21 namespace IntellVoiceUtils {
~ThreadWrapper()22 ThreadWrapper::~ThreadWrapper()
23 {
24     Join();
25 }
26 
Start(const std::string & name,TaskQoS qos)27 bool ThreadWrapper::Start(const std::string &name, TaskQoS qos)
28 {
29     std::unique_lock uniqueLock(mutex_);
30     if (thread_ != nullptr) {
31         INTELL_VOICE_LOG_WARN("thread is already started, name:%{public}s", name.c_str());
32         return true;
33     }
34 
35 #ifdef USE_FFRT
36     INTELL_VOICE_LOG_INFO("use ffrt");
37     thread_ = std::make_unique<ffrt::thread>(name.c_str(), Convert2FfrtQos(qos), &ThreadWrapper::RunInThread, this);
38 #else
39     INTELL_VOICE_LOG_INFO("do not use ffrt");
40     thread_ = std::make_unique<std::thread>(&ThreadWrapper::RunInThread, this);
41 #endif
42 
43     if (thread_ == nullptr) {
44         INTELL_VOICE_LOG_ERROR("failed to create thread");
45         return false;
46     }
47 
48 #ifndef USE_FFRT
49     pthread_setname_np(thread_->native_handle(), name.c_str());
50 #endif
51     return true;
52 }
53 
Join()54 void ThreadWrapper::Join()
55 {
56     std::unique_lock uniqueLock(mutex_);
57     if (thread_ == nullptr) {
58         return;
59     }
60     if (thread_->joinable()) {
61         uniqueLock.unlock();
62         thread_->join();
63         uniqueLock.lock();
64     }
65     thread_.reset();
66 }
67 
RunInThread()68 void ThreadWrapper::RunInThread()
69 {
70     Run();
71 }
72 
73 #ifdef USE_FFRT
Convert2FfrtQos(TaskQoS taskqos)74 ffrt::qos ThreadWrapper::Convert2FfrtQos(TaskQoS taskqos)
75 {
76     switch (taskqos) {
77         case TaskQoS::INHERENT:
78             return ffrt::qos_inherit;
79         case TaskQoS::BACKGROUND:
80             return ffrt::qos_background;
81         case TaskQoS::UTILITY:
82             return ffrt::qos_utility;
83         case TaskQoS::DEFAULT:
84             return ffrt::qos_default;
85         case TaskQoS::USER_INITIATED:
86             return ffrt::qos_user_initiated;
87         case TaskQoS::DEADLINE_REQUEST:
88             return ffrt::qos_deadline_request;
89         case TaskQoS::USER_INTERACTIVE:
90             return ffrt::qos_user_interactive;
91         default:
92             break;
93     }
94 
95     return ffrt::qos_inherit;
96 }
97 #endif
98 }
99 }