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