• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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