1 /*
2 * Copyright (c) 2021 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 "spec_task_dispatcher.h"
17 #include "task_handler_libevent_adapter.h"
18
19 namespace OHOS {
20 namespace AppExecFwk {
21 std::string SpecTaskDispatcher::DISPATCHER_TAG = "SpecTaskDispatcher";
22 std::string SpecTaskDispatcher::ASYNC_DISPATCHER_TAG = DISPATCHER_TAG + "::asyncDispatch";
23 std::string SpecTaskDispatcher::SYNC_DISPATCHER_TAG = DISPATCHER_TAG + "::syncDispatch";
24 std::string SpecTaskDispatcher::DELAY_DISPATCHER_TAG = DISPATCHER_TAG + "::delayDispatch";
SpecTaskDispatcher(std::shared_ptr<SpecDispatcherConfig> config,std::shared_ptr<EventRunner> runner)25 SpecTaskDispatcher::SpecTaskDispatcher(
26 std::shared_ptr<SpecDispatcherConfig> config, std::shared_ptr<EventRunner> runner)
27 : BaseTaskDispatcher(config->GetName(), config->GetPriority())
28 {
29 handler_ = std::make_shared<TaskHandlerLibeventAdapter>(runner);
30 }
31
SyncDispatch(const std::shared_ptr<Runnable> & runnable)32 ErrCode SpecTaskDispatcher::SyncDispatch(const std::shared_ptr<Runnable> &runnable)
33 {
34 APP_LOGI("SpecTaskDispatcher::SyncDispatch start");
35 if (handler_ == nullptr) {
36 APP_LOGE("SpecTaskDispatcher::SyncDispatch handler is nullptr");
37 return ERR_APPEXECFWK_CHECK_FAILED;
38 }
39 if (Check(runnable) != ERR_OK) {
40 APP_LOGE("SpecTaskDispatcher::SyncDispatch check failed");
41 return ERR_APPEXECFWK_CHECK_FAILED;
42 }
43
44 std::shared_ptr<Task> innerTask = std::make_shared<Task>(runnable, GetPriority(), shared_from_this());
45 if (innerTask == nullptr) {
46 APP_LOGE("SpecTaskDispatcher::SyncDispatch innerTask is nullptr");
47 return ERR_APPEXECFWK_CHECK_FAILED;
48 }
49 TracePointBeforePost(innerTask, false, SYNC_DISPATCHER_TAG);
50 APP_LOGI("SpecTaskDispatcher::SyncDispatch into new sync task");
51 handler_->DispatchSync(runnable);
52 TracePointAfterPost(innerTask, false, DISPATCHER_TAG);
53
54 APP_LOGI("SpecTaskDispatcher::SyncDispatch end");
55 return ERR_OK;
56 }
57
AsyncDispatch(const std::shared_ptr<Runnable> & runnable)58 std::shared_ptr<Revocable> SpecTaskDispatcher::AsyncDispatch(const std::shared_ptr<Runnable> &runnable)
59 {
60 APP_LOGI("SpecTaskDispatcher::AsyncDispatch start");
61 if (handler_ == nullptr) {
62 APP_LOGE("SpecTaskDispatcher::AsyncDispatch handler is nullptr");
63 return nullptr;
64 }
65 if (Check(runnable) != ERR_OK) {
66 APP_LOGE("SpecTaskDispatcher::AsyncDispatch check failed");
67 return nullptr;
68 }
69
70 std::shared_ptr<Task> innerTask = std::make_shared<Task>(runnable, GetPriority(), shared_from_this());
71 if (innerTask == nullptr) {
72 APP_LOGE("SpecTaskDispatcher::AsyncDispatch innerTask is nullptr");
73 return nullptr;
74 }
75 TracePointBeforePost(innerTask, true, ASYNC_DISPATCHER_TAG);
76 APP_LOGI("SpecTaskDispatcher::AsyncDispatch into new async task");
77 handler_->Dispatch(runnable);
78 APP_LOGI("SpecTaskDispatcher::AsyncDispatch end");
79 return innerTask;
80 }
81
DelayDispatch(const std::shared_ptr<Runnable> & runnable,long delayMs)82 std::shared_ptr<Revocable> SpecTaskDispatcher::DelayDispatch(const std::shared_ptr<Runnable> &runnable, long delayMs)
83 {
84 APP_LOGI("SpecTaskDispatcher::DelayDispatch start");
85 if (handler_ == nullptr) {
86 APP_LOGE("SpecTaskDispatcher::DelayDispatch handler is nullptr");
87 return nullptr;
88 }
89 if (Check(runnable) != ERR_OK) {
90 APP_LOGE("SpecTaskDispatcher::DelayDispatch check failed");
91 return nullptr;
92 }
93
94 std::shared_ptr<Task> innerTask = std::make_shared<Task>(runnable, GetPriority(), shared_from_this());
95 if (innerTask == nullptr) {
96 APP_LOGE("SpecTaskDispatcher::DelayDispatch innerTask is nullptr");
97 return nullptr;
98 }
99 TracePointBeforePost(innerTask, true, DELAY_DISPATCHER_TAG);
100 handler_->Dispatch(runnable, delayMs);
101 APP_LOGI("SpecTaskDispatcher::DelayDispatch end");
102 return innerTask;
103 }
104 } // namespace AppExecFwk
105 } // namespace OHOS
106