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