1 /*
2  * Copyright (c) 2023 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 
16 #include "common/include/task_scheduler.h"
17 #include "hitrace_meter.h"
18 
19 namespace OHOS::Rosen {
TaskScheduler(const std::string & threadName)20 TaskScheduler::TaskScheduler(const std::string& threadName)
21 {
22     auto runner = AppExecFwk::EventRunner::Create(threadName);
23     handler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
24 }
25 
GetEventHandler()26 std::shared_ptr<AppExecFwk::EventHandler> TaskScheduler::GetEventHandler()
27 {
28     return handler_;
29 }
30 
PostAsyncTask(Task && task,const std::string & name,int64_t delayTime)31 void TaskScheduler::PostAsyncTask(Task&& task, const std::string& name, int64_t delayTime)
32 {
33     auto localTask = [task, name] () {
34         HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", name.c_str());
35         task();
36     };
37     if (!handler_ || (delayTime == 0 && handler_->GetEventRunner()->IsCurrentRunnerThread())) {
38         return localTask();
39     }
40     handler_->PostTask(std::move(localTask), "wms:" + name, delayTime, AppExecFwk::EventQueue::Priority::IMMEDIATE);
41 }
42 
PostVoidSyncTask(Task && task,const std::string & name)43 void TaskScheduler::PostVoidSyncTask(Task&& task, const std::string& name)
44 {
45     auto localTask = [task, name] () {
46         HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", name.c_str());
47         task();
48     };
49     if (!handler_ || handler_->GetEventRunner()->IsCurrentRunnerThread()) {
50         return localTask();
51     }
52     handler_->PostSyncTask(std::move(localTask), "wms:" + name, AppExecFwk::EventQueue::Priority::IMMEDIATE);
53 }
54 
PostTask(Task && task,const std::string & name,int64_t delayTime)55 void TaskScheduler::PostTask(Task&& task, const std::string& name, int64_t delayTime)
56 {
57     auto localTask = [task, name] () {
58         HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", name.c_str());
59         task();
60     };
61     if (!handler_ || (delayTime == 0 && handler_->GetEventRunner()->IsCurrentRunnerThread())) {
62         return localTask();
63     }
64     handler_->PostTask(std::move(localTask), "wms:" + name, delayTime, AppExecFwk::EventQueue::Priority::IMMEDIATE);
65 }
66 
RemoveTask(const std::string & name)67 void TaskScheduler::RemoveTask(const std::string& name)
68 {
69     if (handler_) {
70         handler_->RemoveTask("wms:" + name);
71     }
72 }
73 
StartTraceForSyncTask(std::string name)74 void StartTraceForSyncTask(std::string name)
75 {
76     StartTraceArgs(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", name.c_str());
77 }
FinishTraceForSyncTask()78 void FinishTraceForSyncTask()
79 {
80     FinishTrace(HITRACE_TAG_WINDOW_MANAGER);
81 }
82 } // namespace OHOS::Rosen
83