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 #include "window_manager_hilog.h"
19
20 namespace OHOS::Rosen {
TaskScheduler(const std::string& threadName)21 TaskScheduler::TaskScheduler(const std::string& threadName)
22 {
23 auto runner = AppExecFwk::EventRunner::Create(threadName);
24 handler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
25 pid_t tid = 0;
26 auto task = [&tid]() mutable {
27 tid = gettid();
28 TLOGI(WmsLogTag::WMS_MAIN, "get WMSTid %{public}d", static_cast<int>(tid));
29 };
30 handler_->PostSyncTask(std::move(task), "wms:setTid", AppExecFwk::EventQueue::Priority::IMMEDIATE);
31 ssmTid_ = tid;
32 }
33
GetEventHandler()34 std::shared_ptr<AppExecFwk::EventHandler> TaskScheduler::GetEventHandler()
35 {
36 return handler_;
37 }
38
PostAsyncTask(Task&& task, const std::string& name, int64_t delayTime)39 void TaskScheduler::PostAsyncTask(Task&& task, const std::string& name, int64_t delayTime)
40 {
41 if (delayTime == 0 && handler_->GetEventRunner()->IsCurrentRunnerThread()) {
42 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", name.c_str());
43 task();
44 return;
45 }
46 auto localTask = [weak = weak_from_this(), task, name]() {
47 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", name.c_str());
48 task();
49 if (auto self = weak.lock()) {
50 self->ExecuteExportTask();
51 }
52 };
53 handler_->PostTask(std::move(localTask), "wms:" + name, delayTime, AppExecFwk::EventQueue::Priority::IMMEDIATE);
54 }
55
PostVoidSyncTask(Task&& task, const std::string& name)56 void TaskScheduler::PostVoidSyncTask(Task&& task, const std::string& name)
57 {
58 if (handler_->GetEventRunner()->IsCurrentRunnerThread()) {
59 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", name.c_str());
60 task();
61 return;
62 }
63 auto localTask = [weak = weak_from_this(), task, name]() {
64 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", name.c_str());
65 task();
66 if (auto self = weak.lock()) {
67 self->ExecuteExportTask();
68 }
69 };
70 handler_->PostSyncTask(std::move(localTask), "wms:" + name, AppExecFwk::EventQueue::Priority::IMMEDIATE);
71 }
72
PostTask(Task&& task, const std::string& name, int64_t delayTime)73 void TaskScheduler::PostTask(Task&& task, const std::string& name, int64_t delayTime)
74 {
75 if (handler_->GetEventRunner()->IsCurrentRunnerThread()) {
76 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", name.c_str());
77 task();
78 return;
79 }
80 auto localTask = [weak = weak_from_this(), task, name]() {
81 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", name.c_str());
82 task();
83 if (auto self = weak.lock()) {
84 self->ExecuteExportTask();
85 }
86 };
87 handler_->PostTask(std::move(localTask), "wms:" + name, delayTime, AppExecFwk::EventQueue::Priority::IMMEDIATE);
88 }
89
RemoveTask(const std::string& name)90 void TaskScheduler::RemoveTask(const std::string& name)
91 {
92 handler_->RemoveTask("wms:" + name);
93 }
94
AddExportTask(std::string taskName, Task task)95 void TaskScheduler::AddExportTask(std::string taskName, Task task)
96 {
97 if (ssmTid_ == 0 || gettid() != ssmTid_) {
98 return task();
99 }
100 exportFuncMap_[taskName] = task;
101 }
102
SetExportHandler(const std::shared_ptr<AppExecFwk::EventHandler>& handler)103 void TaskScheduler::SetExportHandler(const std::shared_ptr<AppExecFwk::EventHandler>& handler)
104 {
105 exportHandler_ = handler;
106 }
107
ExecuteExportTask()108 void TaskScheduler::ExecuteExportTask()
109 {
110 if (exportFuncMap_.empty()) {
111 return;
112 }
113 std::shared_ptr<AppExecFwk::EventHandler> exportHandler = exportHandler_.lock();
114 if (!exportHandler) {
115 return;
116 }
117 auto task = [funcMap = std::move(exportFuncMap_)]() {
118 for (auto iter = funcMap.begin(); iter != funcMap.end(); iter++) {
119 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", iter->first.c_str());
120 iter->second();
121 }
122 };
123 exportFuncMap_.clear();
124 exportHandler->PostTask(task, "wms:exportTask");
125 }
126
StartTraceForSyncTask(std::string name)127 void StartTraceForSyncTask(std::string name)
128 {
129 StartTraceArgs(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", name.c_str());
130 }
FinishTraceForSyncTask()131 void FinishTraceForSyncTask()
132 {
133 FinishTrace(HITRACE_TAG_WINDOW_MANAGER);
134 }
135 } // namespace OHOS::Rosen