1e0dac50fSopenharmony_ci/*
2e0dac50fSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3e0dac50fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e0dac50fSopenharmony_ci * you may not use this file except in compliance with the License.
5e0dac50fSopenharmony_ci * You may obtain a copy of the License at
6e0dac50fSopenharmony_ci *
7e0dac50fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e0dac50fSopenharmony_ci *
9e0dac50fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e0dac50fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e0dac50fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e0dac50fSopenharmony_ci * See the License for the specific language governing permissions and
13e0dac50fSopenharmony_ci * limitations under the License.
14e0dac50fSopenharmony_ci */
15e0dac50fSopenharmony_ci
16e0dac50fSopenharmony_ci#include "common/include/task_scheduler.h"
17e0dac50fSopenharmony_ci#include "hitrace_meter.h"
18e0dac50fSopenharmony_ci#include "window_manager_hilog.h"
19e0dac50fSopenharmony_ci
20e0dac50fSopenharmony_cinamespace OHOS::Rosen {
21e0dac50fSopenharmony_ciTaskScheduler::TaskScheduler(const std::string& threadName)
22e0dac50fSopenharmony_ci{
23e0dac50fSopenharmony_ci    auto runner = AppExecFwk::EventRunner::Create(threadName);
24e0dac50fSopenharmony_ci    handler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
25e0dac50fSopenharmony_ci    pid_t tid = 0;
26e0dac50fSopenharmony_ci    auto task = [&tid]() mutable {
27e0dac50fSopenharmony_ci        tid = gettid();
28e0dac50fSopenharmony_ci        TLOGI(WmsLogTag::WMS_MAIN, "get WMSTid %{public}d", static_cast<int>(tid));
29e0dac50fSopenharmony_ci    };
30e0dac50fSopenharmony_ci    handler_->PostSyncTask(std::move(task), "wms:setTid", AppExecFwk::EventQueue::Priority::IMMEDIATE);
31e0dac50fSopenharmony_ci    ssmTid_ = tid;
32e0dac50fSopenharmony_ci}
33e0dac50fSopenharmony_ci
34e0dac50fSopenharmony_cistd::shared_ptr<AppExecFwk::EventHandler> TaskScheduler::GetEventHandler()
35e0dac50fSopenharmony_ci{
36e0dac50fSopenharmony_ci    return handler_;
37e0dac50fSopenharmony_ci}
38e0dac50fSopenharmony_ci
39e0dac50fSopenharmony_civoid TaskScheduler::PostAsyncTask(Task&& task, const std::string& name, int64_t delayTime)
40e0dac50fSopenharmony_ci{
41e0dac50fSopenharmony_ci    if (delayTime == 0 && handler_->GetEventRunner()->IsCurrentRunnerThread()) {
42e0dac50fSopenharmony_ci        HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", name.c_str());
43e0dac50fSopenharmony_ci        task();
44e0dac50fSopenharmony_ci        return;
45e0dac50fSopenharmony_ci    }
46e0dac50fSopenharmony_ci    auto localTask = [weak = weak_from_this(), task, name]() {
47e0dac50fSopenharmony_ci        HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", name.c_str());
48e0dac50fSopenharmony_ci        task();
49e0dac50fSopenharmony_ci        if (auto self = weak.lock()) {
50e0dac50fSopenharmony_ci            self->ExecuteExportTask();
51e0dac50fSopenharmony_ci        }
52e0dac50fSopenharmony_ci    };
53e0dac50fSopenharmony_ci    handler_->PostTask(std::move(localTask), "wms:" + name, delayTime, AppExecFwk::EventQueue::Priority::IMMEDIATE);
54e0dac50fSopenharmony_ci}
55e0dac50fSopenharmony_ci
56e0dac50fSopenharmony_civoid TaskScheduler::PostVoidSyncTask(Task&& task, const std::string& name)
57e0dac50fSopenharmony_ci{
58e0dac50fSopenharmony_ci    if (handler_->GetEventRunner()->IsCurrentRunnerThread()) {
59e0dac50fSopenharmony_ci        HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", name.c_str());
60e0dac50fSopenharmony_ci        task();
61e0dac50fSopenharmony_ci        return;
62e0dac50fSopenharmony_ci    }
63e0dac50fSopenharmony_ci    auto localTask = [weak = weak_from_this(), task, name]() {
64e0dac50fSopenharmony_ci        HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", name.c_str());
65e0dac50fSopenharmony_ci        task();
66e0dac50fSopenharmony_ci        if (auto self = weak.lock()) {
67e0dac50fSopenharmony_ci            self->ExecuteExportTask();
68e0dac50fSopenharmony_ci        }
69e0dac50fSopenharmony_ci    };
70e0dac50fSopenharmony_ci    handler_->PostSyncTask(std::move(localTask), "wms:" + name, AppExecFwk::EventQueue::Priority::IMMEDIATE);
71e0dac50fSopenharmony_ci}
72e0dac50fSopenharmony_ci
73e0dac50fSopenharmony_civoid TaskScheduler::PostTask(Task&& task, const std::string& name, int64_t delayTime)
74e0dac50fSopenharmony_ci{
75e0dac50fSopenharmony_ci    if (handler_->GetEventRunner()->IsCurrentRunnerThread()) {
76e0dac50fSopenharmony_ci        HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", name.c_str());
77e0dac50fSopenharmony_ci        task();
78e0dac50fSopenharmony_ci        return;
79e0dac50fSopenharmony_ci    }
80e0dac50fSopenharmony_ci    auto localTask = [weak = weak_from_this(), task, name]() {
81e0dac50fSopenharmony_ci        HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", name.c_str());
82e0dac50fSopenharmony_ci        task();
83e0dac50fSopenharmony_ci        if (auto self = weak.lock()) {
84e0dac50fSopenharmony_ci            self->ExecuteExportTask();
85e0dac50fSopenharmony_ci        }
86e0dac50fSopenharmony_ci    };
87e0dac50fSopenharmony_ci    handler_->PostTask(std::move(localTask), "wms:" + name, delayTime, AppExecFwk::EventQueue::Priority::IMMEDIATE);
88e0dac50fSopenharmony_ci}
89e0dac50fSopenharmony_ci
90e0dac50fSopenharmony_civoid TaskScheduler::RemoveTask(const std::string& name)
91e0dac50fSopenharmony_ci{
92e0dac50fSopenharmony_ci    handler_->RemoveTask("wms:" + name);
93e0dac50fSopenharmony_ci}
94e0dac50fSopenharmony_ci
95e0dac50fSopenharmony_civoid TaskScheduler::AddExportTask(std::string taskName, Task task)
96e0dac50fSopenharmony_ci{
97e0dac50fSopenharmony_ci    if (ssmTid_ == 0 || gettid() != ssmTid_) {
98e0dac50fSopenharmony_ci        return task();
99e0dac50fSopenharmony_ci    }
100e0dac50fSopenharmony_ci    exportFuncMap_[taskName] = task;
101e0dac50fSopenharmony_ci}
102e0dac50fSopenharmony_ci
103e0dac50fSopenharmony_civoid TaskScheduler::SetExportHandler(const std::shared_ptr<AppExecFwk::EventHandler>& handler)
104e0dac50fSopenharmony_ci{
105e0dac50fSopenharmony_ci    exportHandler_ = handler;
106e0dac50fSopenharmony_ci}
107e0dac50fSopenharmony_ci
108e0dac50fSopenharmony_civoid TaskScheduler::ExecuteExportTask()
109e0dac50fSopenharmony_ci{
110e0dac50fSopenharmony_ci    if (exportFuncMap_.empty()) {
111e0dac50fSopenharmony_ci        return;
112e0dac50fSopenharmony_ci    }
113e0dac50fSopenharmony_ci    std::shared_ptr<AppExecFwk::EventHandler> exportHandler = exportHandler_.lock();
114e0dac50fSopenharmony_ci    if (!exportHandler) {
115e0dac50fSopenharmony_ci        return;
116e0dac50fSopenharmony_ci    }
117e0dac50fSopenharmony_ci    auto task = [funcMap = std::move(exportFuncMap_)]() {
118e0dac50fSopenharmony_ci        for (auto iter = funcMap.begin(); iter != funcMap.end(); iter++) {
119e0dac50fSopenharmony_ci            HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", iter->first.c_str());
120e0dac50fSopenharmony_ci            iter->second();
121e0dac50fSopenharmony_ci        }
122e0dac50fSopenharmony_ci    };
123e0dac50fSopenharmony_ci    exportFuncMap_.clear();
124e0dac50fSopenharmony_ci    exportHandler->PostTask(task, "wms:exportTask");
125e0dac50fSopenharmony_ci}
126e0dac50fSopenharmony_ci
127e0dac50fSopenharmony_civoid StartTraceForSyncTask(std::string name)
128e0dac50fSopenharmony_ci{
129e0dac50fSopenharmony_ci    StartTraceArgs(HITRACE_TAG_WINDOW_MANAGER, "ssm:%s", name.c_str());
130e0dac50fSopenharmony_ci}
131e0dac50fSopenharmony_civoid FinishTraceForSyncTask()
132e0dac50fSopenharmony_ci{
133e0dac50fSopenharmony_ci    FinishTrace(HITRACE_TAG_WINDOW_MANAGER);
134e0dac50fSopenharmony_ci}
135e0dac50fSopenharmony_ci} // namespace OHOS::Rosen