1 /*
2 * Copyright (c) 2021-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 "event_handler.h"
17
18 #include <unistd.h>
19 #include <sys/syscall.h>
20 #include "event_handler_utils.h"
21 #include "event_logger.h"
22 #ifdef HAS_HICHECKER_NATIVE_PART
23 #include "hichecker.h"
24 #endif // HAS_HICHECKER_NATIVE_PART
25 #ifdef FFRT_USAGE_ENABLE
26 #include "ffrt_inner.h"
27 #endif // FFRT_USAGE_ENABLE
28 #include "thread_local_data.h"
29 #include "event_hitrace_meter_adapter.h"
30
31 using namespace OHOS::HiviewDFX;
32 namespace OHOS {
33 namespace AppExecFwk {
34 namespace {
35 static constexpr int FFRT_TASK_REMOVE_SUCCESS = 0;
36 static constexpr int FFRT_TASK_REMOVE_FAIL = 1;
37 DEFINE_EH_HILOG_LABEL("EventHandler");
38 }
39 thread_local std::weak_ptr<EventHandler> EventHandler::currentEventHandler;
40
Current()41 std::shared_ptr<EventHandler> EventHandler::Current()
42 {
43 #ifdef FFRT_USAGE_ENABLE
44 if (ffrt_this_task_get_id()) {
45 auto handler = ffrt_get_current_queue_eventhandler();
46 if (handler == nullptr) {
47 HILOGW("Current handler is null.");
48 return nullptr;
49 }
50 return *(reinterpret_cast<std::shared_ptr<EventHandler>*>(handler));
51 } else {
52 return currentEventHandler.lock();
53 }
54 #else
55 return currentEventHandler.lock();
56 #endif
57 }
58
EventHandler(const std::shared_ptr<EventRunner> & runner)59 EventHandler::EventHandler(const std::shared_ptr<EventRunner> &runner) : eventRunner_(runner)
60 {
61 static std::atomic<uint64_t> handlerCount = 1;
62 handlerId_ = std::to_string(handlerCount.load()) + "_" + std::to_string(GetTimeStamp());
63 handlerCount.fetch_add(1);
64 EH_LOGI_LIMIT("Create eventHandler %{public}s", handlerId_.c_str());
65 }
66
~EventHandler()67 EventHandler::~EventHandler()
68 {
69 EH_LOGI_LIMIT("~EventHandler enter %{public}s", handlerId_.c_str());
70 if (eventRunner_) {
71 HILOGD("eventRunner is alive");
72 /*
73 * This handler is finishing, need to remove all events belong to it.
74 * But events only have weak pointer of this handler,
75 * now weak pointer is invalid, so these events become orphans.
76 */
77 #ifdef FFRT_USAGE_ENABLE
78 if (eventRunner_->threadMode_ == ThreadMode::FFRT) {
79 eventRunner_->GetEventQueue()->RemoveOrphanByHandlerId(handlerId_);
80 } else {
81 eventRunner_->GetEventQueue()->RemoveOrphan();
82 }
83 #else
84 eventRunner_->GetEventQueue()->RemoveOrphan();
85 #endif
86 }
87 }
88
SendEvent(InnerEvent::Pointer & event,int64_t delayTime,Priority priority)89 bool EventHandler::SendEvent(InnerEvent::Pointer &event, int64_t delayTime, Priority priority)
90 {
91 if (!event) {
92 HILOGE("Could not send an invalid event");
93 return false;
94 }
95
96 InnerEvent::TimePoint now = InnerEvent::Clock::now();
97 event->SetSendTime(now);
98 event->SetSenderKernelThreadId(getproctid());
99 event->SetEventUniqueId();
100 if (delayTime > 0) {
101 event->SetHandleTime(now + std::chrono::milliseconds(delayTime));
102 } else {
103 event->SetHandleTime(now);
104 }
105 event->SetOwnerId(handlerId_);
106 event->SetDelayTime(delayTime);
107 event->SetOwner(shared_from_this());
108 // get traceId from event, if HiTraceChain::begin has been called, would get a valid trace id.
109 auto traceId = event->GetOrCreateTraceId();
110 // if traceId is valid, out put trace information
111 if (AllowHiTraceOutPut(traceId, event->HasWaiter())) {
112 HiTracePointerOutPut(traceId, event, "Send", HiTraceTracepointType::HITRACE_TP_CS);
113 }
114 HILOGD("Current event id is %{public}s .", (event->GetEventUniqueId()).c_str());
115 if (!eventRunner_) {
116 HILOGE("MUST Set event runner before sending events");
117 return false;
118 }
119 eventRunner_->GetEventQueue()->Insert(event, priority);
120 return true;
121 }
122
PostTaskAtFront(const Callback & callback,const std::string & name,Priority priority,const Caller & caller)123 bool EventHandler::PostTaskAtFront(const Callback &callback, const std::string &name, Priority priority,
124 const Caller &caller)
125 {
126 if (!eventRunner_) {
127 HILOGE("MUST Set event runner before posting events");
128 return false;
129 }
130
131 auto event = InnerEvent::Get(callback, name, caller);
132 if (!event) {
133 HILOGE("Get an invalid event");
134 return false;
135 }
136
137 event->SetDelayTime(0);
138 event->SetOwnerId(handlerId_);
139 InnerEvent::TimePoint now = InnerEvent::Clock::now();
140 event->SetSendTime(now);
141 event->SetHandleTime(now);
142 event->SetSenderKernelThreadId(getproctid());
143 event->SetEventUniqueId();
144 event->SetOwner(shared_from_this());
145 auto traceId = event->GetOrCreateTraceId();
146 if (AllowHiTraceOutPut(traceId, event->HasWaiter())) {
147 HiTracePointerOutPut(traceId, event, "Send", HiTraceTracepointType::HITRACE_TP_CS);
148 }
149 HILOGD("Current front event id is %{public}s .", (event->GetEventUniqueId()).c_str());
150 eventRunner_->GetEventQueue()->Insert(event, priority, EventInsertType::AT_FRONT);
151 return true;
152 }
153
SendTimingEvent(InnerEvent::Pointer & event,int64_t taskTime,Priority priority)154 bool EventHandler::SendTimingEvent(InnerEvent::Pointer &event, int64_t taskTime, Priority priority)
155 {
156 InnerEvent::TimePoint nowSys = InnerEvent::Clock::now();
157 auto epoch = nowSys.time_since_epoch();
158 long nowSysTime = std::chrono::duration_cast<std::chrono::milliseconds>(epoch).count();
159 int64_t delayTime = taskTime - nowSysTime;
160 if (delayTime < 0) {
161 HILOGW("SendTime is before now systime, change to 0 delaytime Event");
162 return SendEvent(event, 0, priority);
163 }
164
165 return SendEvent(event, delayTime, priority);
166 }
167
SendSyncEvent(InnerEvent::Pointer & event,Priority priority)168 bool EventHandler::SendSyncEvent(InnerEvent::Pointer &event, Priority priority)
169 {
170 if ((!event) || (priority == Priority::IDLE)) {
171 HILOGE("Could not send an invalid event or idle event");
172 return false;
173 }
174
175 if ((!eventRunner_) || (!eventRunner_->IsRunning())) {
176 HILOGE("MUST Set a running event runner before sending sync events");
177 return false;
178 }
179
180 #ifdef FFRT_USAGE_ENABLE
181 if ((ffrt_this_task_get_id() && eventRunner_->threadMode_ == ThreadMode::FFRT) ||
182 eventRunner_ == EventRunner::Current()) {
183 DistributeEvent(event);
184 return true;
185 }
186
187 // get traceId from event, if HiTraceChain::begin has been called, would get a valid trace id.
188 auto spanId = event->GetOrCreateTraceId();
189
190 if (eventRunner_->threadMode_ == ThreadMode::FFRT) {
191 eventRunner_->GetEventQueue()->InsertSyncEvent(event, priority);
192 } else {
193 // Create waiter, used to block.
194 auto waiter = event->CreateWaiter();
195 // Send this event as normal one.
196 if (!SendEvent(event, 0, priority)) {
197 HILOGE("SendEvent is failed");
198 return false;
199 }
200 // Wait until event is processed(recycled).
201 waiter->Wait();
202 }
203 #else
204 // If send a sync event in same event runner, distribute here.
205 if (eventRunner_ == EventRunner::Current()) {
206 DistributeEvent(event);
207 return true;
208 }
209
210 // get traceId from event, if HiTraceChain::begin has been called, would get a valid trace id.
211 auto spanId = event->GetOrCreateTraceId();
212
213 // Create waiter, used to block.
214 auto waiter = event->CreateWaiter();
215 // Send this event as normal one.
216 if (!SendEvent(event, 0, priority)) {
217 HILOGE("SendEvent is failed");
218 return false;
219 }
220 // Wait until event is processed(recycled).
221 waiter->Wait();
222 #endif
223 if ((spanId) && (spanId->IsValid())) {
224 HiTraceChain::Tracepoint(HiTraceTracepointType::HITRACE_TP_CR, *spanId, "event is processed");
225 }
226
227 return true;
228 }
229
RemoveAllEvents()230 void EventHandler::RemoveAllEvents()
231 {
232 HILOGD("RemoveAllEvents enter");
233 if (!eventRunner_) {
234 HILOGE("MUST Set event runner before removing all events");
235 return;
236 }
237
238 eventRunner_->GetEventQueue()->Remove(shared_from_this());
239 }
240
RemoveEvent(uint32_t innerEventId)241 void EventHandler::RemoveEvent(uint32_t innerEventId)
242 {
243 HILOGD("RemoveEvent enter");
244 if (!eventRunner_) {
245 HILOGE("MUST Set event runner before removing events by id");
246 return;
247 }
248
249 eventRunner_->GetEventQueue()->Remove(shared_from_this(), innerEventId);
250 }
251
RemoveEvent(uint32_t innerEventId,int64_t param)252 void EventHandler::RemoveEvent(uint32_t innerEventId, int64_t param)
253 {
254 HILOGD("RemoveEvent -- enter");
255 if (!eventRunner_) {
256 HILOGE("MUST Set event runner before removing events by id and param");
257 return;
258 }
259
260 eventRunner_->GetEventQueue()->Remove(shared_from_this(), innerEventId, param);
261 }
262
RemoveTask(const std::string & name)263 void EventHandler::RemoveTask(const std::string &name)
264 {
265 HILOGD("RemoveTask enter");
266 if (!eventRunner_) {
267 HILOGE("MUST Set event runner before removing events by task name");
268 return;
269 }
270
271 eventRunner_->GetEventQueue()->Remove(shared_from_this(), name);
272 }
273
RemoveTaskWithRet(const std::string & name)274 int EventHandler::RemoveTaskWithRet(const std::string &name)
275 {
276 HILOGD("RemoveTaskWithRet enter");
277 if (!eventRunner_) {
278 HILOGE("MUST Ret Set event runner before removing events by task name");
279 return FFRT_TASK_REMOVE_FAIL;
280 }
281
282 bool ret = eventRunner_->GetEventQueue()->Remove(shared_from_this(), name);
283 return ret ? FFRT_TASK_REMOVE_SUCCESS : FFRT_TASK_REMOVE_FAIL;
284 }
285
AddFileDescriptorListener(int32_t fileDescriptor,uint32_t events,const std::shared_ptr<FileDescriptorListener> & listener,const std::string & taskName)286 ErrCode EventHandler::AddFileDescriptorListener(int32_t fileDescriptor, uint32_t events,
287 const std::shared_ptr<FileDescriptorListener> &listener, const std::string &taskName)
288 {
289 return AddFileDescriptorListener(fileDescriptor, events, listener, taskName, EventQueue::Priority::HIGH);
290 }
291
AddFileDescriptorListener(int32_t fileDescriptor,uint32_t events,const std::shared_ptr<FileDescriptorListener> & listener,const std::string & taskName,EventQueue::Priority priority)292 ErrCode EventHandler::AddFileDescriptorListener(int32_t fileDescriptor, uint32_t events,
293 const std::shared_ptr<FileDescriptorListener> &listener, const std::string &taskName,
294 EventQueue::Priority priority)
295 {
296 HILOGD("enter");
297 if ((fileDescriptor < 0) || ((events & FILE_DESCRIPTOR_EVENTS_MASK) == 0) || (!listener)) {
298 HILOGE("%{public}d, %{public}u, %{public}s: Invalid parameter",
299 fileDescriptor, events, listener ? "valid" : "null");
300 return EVENT_HANDLER_ERR_INVALID_PARAM;
301 }
302
303 if (!eventRunner_) {
304 HILOGE("MUST Set event runner before adding fd listener");
305 return EVENT_HANDLER_ERR_NO_EVENT_RUNNER;
306 }
307
308 listener->SetOwner(shared_from_this());
309 return eventRunner_->GetEventQueue()->AddFileDescriptorListener(fileDescriptor, events, listener, taskName,
310 priority);
311 }
312
RemoveAllFileDescriptorListeners()313 void EventHandler::RemoveAllFileDescriptorListeners()
314 {
315 HILOGD("enter");
316 if (!eventRunner_) {
317 HILOGE("MUST Set event runner before removing all fd listener");
318 return;
319 }
320
321 eventRunner_->GetEventQueue()->RemoveFileDescriptorListener(shared_from_this());
322 }
323
RemoveFileDescriptorListener(int32_t fileDescriptor)324 void EventHandler::RemoveFileDescriptorListener(int32_t fileDescriptor)
325 {
326 HILOGD("enter");
327 if (fileDescriptor < 0) {
328 HILOGE("fd %{public}d: Invalid parameter", fileDescriptor);
329 return;
330 }
331
332 if (!eventRunner_) {
333 HILOGE("MUST Set event runner before removing fd listener by fd");
334 return;
335 }
336
337 eventRunner_->GetEventQueue()->RemoveFileDescriptorListener(fileDescriptor);
338 }
339
SetEventRunner(const std::shared_ptr<EventRunner> & runner)340 void EventHandler::SetEventRunner(const std::shared_ptr<EventRunner> &runner)
341 {
342 HILOGD("enter");
343 if (eventRunner_ == runner) {
344 return;
345 }
346
347 if (eventRunner_) {
348 HILOGW("It is not recommended to change the event runner dynamically");
349
350 // Remove all events and listeners from old event runner.
351 RemoveAllEvents();
352 RemoveAllFileDescriptorListeners();
353 }
354
355 // Switch event runner.
356 eventRunner_ = runner;
357 return;
358 }
359
DeliveryTimeAction(const InnerEvent::Pointer & event,InnerEvent::TimePoint nowStart)360 void EventHandler::DeliveryTimeAction(const InnerEvent::Pointer &event, InnerEvent::TimePoint nowStart)
361 {
362 #ifdef HAS_HICHECKER_NATIVE_PART
363 HILOGD("enter");
364 if (!HiChecker::NeedCheckSlowEvent()) {
365 return;
366 }
367 int64_t deliveryTimeout = eventRunner_->GetDeliveryTimeout();
368 if (deliveryTimeout > 0) {
369 std::string threadName = eventRunner_->GetRunnerThreadName();
370 std::string eventName = GetEventName(event);
371 int64_t threadId = getproctid();
372 std::string threadIdCharacter = std::to_string(threadId);
373 std::chrono::duration<double> deliveryTime = nowStart - event->GetSendTime();
374 std::string deliveryTimeCharacter = std::to_string((deliveryTime).count());
375 std::string deliveryTimeoutCharacter = std::to_string(deliveryTimeout);
376 std::string handOutTag = "threadId: " + threadIdCharacter + "," + "threadName: " + threadName + "," +
377 "eventName: " + eventName + "," + "deliveryTime: " + deliveryTimeCharacter + "," +
378 "deliveryTimeout: " + deliveryTimeoutCharacter;
379 if ((nowStart - std::chrono::milliseconds(deliveryTimeout)) > event->GetHandleTime()) {
380 HiChecker::NotifySlowEvent(handOutTag);
381 if (deliveryTimeoutCallback_) {
382 deliveryTimeoutCallback_();
383 }
384 }
385 }
386 #endif // HAS_HICHECKER_NATIVE_PART
387 }
388
DistributeTimeAction(const InnerEvent::Pointer & event,InnerEvent::TimePoint nowStart)389 void EventHandler::DistributeTimeAction(const InnerEvent::Pointer &event, InnerEvent::TimePoint nowStart)
390 {
391 #ifdef HAS_HICHECKER_NATIVE_PART
392 HILOGD("enter");
393 if (!HiChecker::NeedCheckSlowEvent()) {
394 return;
395 }
396 int64_t distributeTimeout = eventRunner_->GetDistributeTimeout();
397 if (distributeTimeout > 0) {
398 std::string threadName = eventRunner_->GetRunnerThreadName();
399 std::string eventName = GetEventName(event);
400 int64_t threadId = getproctid();
401 std::string threadIdCharacter = std::to_string(threadId);
402 InnerEvent::TimePoint nowEnd = InnerEvent::Clock::now();
403 std::chrono::duration<double> distributeTime = nowEnd - nowStart;
404 std::string distributeTimeCharacter = std::to_string((distributeTime).count());
405 std::string distributeTimeoutCharacter = std::to_string(distributeTimeout);
406 std::string executeTag = "threadId: " + threadIdCharacter + "," + "threadName: " + threadName + "," +
407 "eventName: " + eventName + "," + "distributeTime: " + distributeTimeCharacter + "," +
408 "distributeTimeout: " + distributeTimeoutCharacter;
409 if ((nowEnd - std::chrono::milliseconds(distributeTimeout)) > nowStart) {
410 HiChecker::NotifySlowEvent(executeTag);
411 if (distributeTimeoutCallback_) {
412 distributeTimeoutCallback_();
413 }
414 }
415 }
416 #endif // HAS_HICHECKER_NATIVE_PART
417 }
418
DistributeTimeoutHandler(const InnerEvent::TimePoint & beginTime)419 void EventHandler::DistributeTimeoutHandler(const InnerEvent::TimePoint& beginTime)
420 {
421 int64_t distributeTimeout = EventRunner::GetMainEventRunner()->GetTimeout();
422 if (distributeTimeout > 0) {
423 InnerEvent::TimePoint endTime = InnerEvent::Clock::now();
424 if ((endTime - std::chrono::milliseconds(distributeTimeout)) > beginTime &&
425 EventRunner::distributeCallback_) {
426 HILOGI("AppMainThread Callback.");
427 auto diff = endTime - beginTime;
428 int64_t durationTime = std::chrono::duration_cast<std::chrono::milliseconds>(diff).count();
429 EventRunner::distributeCallback_(durationTime);
430 }
431 }
432 }
433
DistributeEvent(const InnerEvent::Pointer & event)434 void EventHandler::DistributeEvent(const InnerEvent::Pointer &event) __attribute__((no_sanitize("cfi")))
435 {
436 if (!event) {
437 HILOGE("Could not distribute an invalid event");
438 return;
439 }
440
441 currentEventHandler = shared_from_this();
442 if (enableEventLog_) {
443 auto now = InnerEvent::Clock::now();
444 auto currentRunningInfo = "start at " + InnerEvent::DumpTimeToString(now) + "; " + event->Dump() +
445 eventRunner_->GetEventQueue()->DumpCurrentQueueSize();
446 HILOGD("%{public}s", currentRunningInfo.c_str());
447 }
448
449 StartTraceAdapter(event);
450
451 auto spanId = event->GetTraceId();
452 auto traceId = HiTraceChain::GetId();
453 bool allowTraceOutPut = AllowHiTraceOutPut(spanId, event->HasWaiter());
454 if (allowTraceOutPut) {
455 HiTraceChain::SetId(*spanId);
456 HiTracePointerOutPut(spanId, event, "Receive", HiTraceTracepointType::HITRACE_TP_SR);
457 }
458
459 InnerEvent::TimePoint nowStart = InnerEvent::Clock::now();
460 DeliveryTimeAction(event, nowStart);
461 HILOGD("EventName is %{public}s, eventId is %{public}s priority %{public}d.", GetEventName(event).c_str(),
462 (event->GetEventUniqueId()).c_str(), event->GetEventPriority());
463
464 std::string eventName = GetEventName(event);
465 InnerEvent::TimePoint beginTime;
466 bool isAppMainThread = EventRunner::IsAppMainThread();
467 if (EventRunner::distributeBegin_ && isAppMainThread) {
468 beginTime = EventRunner::distributeBegin_(eventName);
469 }
470
471 if (event->HasTask()) {
472 // Call task callback directly if contains a task.
473 HILOGD("excute event taskCallback, event address: %{public}p ", &(event->GetTaskCallback()));
474 (event->GetTaskCallback())();
475 } else {
476 // Otherwise let developers to handle it.
477 ProcessEvent(event);
478 }
479
480 if (EventRunner::distributeBegin_ && EventRunner::distributeEnd_ && isAppMainThread) {
481 EventRunner::distributeEnd_(eventName, beginTime);
482 DistributeTimeoutHandler(beginTime);
483 }
484
485 DistributeTimeAction(event, nowStart);
486
487 if (allowTraceOutPut) {
488 HiTraceChain::Tracepoint(HiTraceTracepointType::HITRACE_TP_SS, *spanId, "Event Distribute over");
489 HiTraceChain::ClearId();
490 if (traceId.IsValid()) {
491 HiTraceChain::SetId(traceId);
492 }
493 }
494 if (enableEventLog_) {
495 auto now = InnerEvent::Clock::now();
496 HILOGD("end at %{public}s", InnerEvent::DumpTimeToString(now).c_str());
497 }
498 FinishTraceAdapter();
499 }
500
Dump(Dumper & dumper)501 void EventHandler::Dump(Dumper &dumper)
502 {
503 auto now = std::chrono::system_clock::now();
504 dumper.Dump(dumper.GetTag() + " EventHandler dump begin curTime: " +
505 InnerEvent::DumpTimeToString(now) + LINE_SEPARATOR);
506 if (eventRunner_ == nullptr) {
507 dumper.Dump(dumper.GetTag() + " event runner uninitialized!" + LINE_SEPARATOR);
508 } else {
509 eventRunner_->Dump(dumper);
510 }
511 }
512
HasInnerEvent(uint32_t innerEventId)513 bool EventHandler::HasInnerEvent(uint32_t innerEventId)
514 {
515 if (!eventRunner_) {
516 HILOGE("event runner uninitialized!");
517 return false;
518 }
519 return eventRunner_->GetEventQueue()->HasInnerEvent(shared_from_this(), innerEventId);
520 }
521
HasInnerEvent(int64_t param)522 bool EventHandler::HasInnerEvent(int64_t param)
523 {
524 if (!eventRunner_) {
525 HILOGE("event runner uninitialized!");
526 return false;
527 }
528 return eventRunner_->GetEventQueue()->HasInnerEvent(shared_from_this(), param);
529 }
530
GetEventName(const InnerEvent::Pointer & event)531 std::string EventHandler::GetEventName(const InnerEvent::Pointer &event)
532 {
533 std::string eventName;
534 if (!event) {
535 HILOGW("event is nullptr");
536 return eventName;
537 }
538
539 if (event->HasTask()) {
540 eventName = event->GetTaskName();
541 } else {
542 InnerEvent::EventId eventId = event->GetInnerEventIdEx();
543 if (eventId.index() == TYPE_U32_INDEX) {
544 eventName = std::to_string(std::get<uint32_t>(eventId));
545 } else {
546 eventName = std::get<std::string>(eventId);
547 }
548 }
549 return eventName;
550 }
551
IsIdle()552 bool EventHandler::IsIdle()
553 {
554 return eventRunner_->GetEventQueue()->IsIdle();
555 }
556
ProcessEvent(const InnerEvent::Pointer &)557 void EventHandler::ProcessEvent(const InnerEvent::Pointer &)
558 {}
559
EnableEventLog(bool enableEventLog)560 void EventHandler::EnableEventLog(bool enableEventLog)
561 {
562 enableEventLog_ = enableEventLog;
563 }
564
HasPreferEvent(int basePrio)565 bool EventHandler::HasPreferEvent(int basePrio)
566 {
567 return eventRunner_->GetEventQueue()->HasPreferEvent(basePrio);
568 }
569
GetMainEventHandlerForFFRT()570 extern "C" void* GetMainEventHandlerForFFRT()
571 {
572 HILOGD("GetMainEventHandlerForFFRT enter");
573 static std::shared_ptr<OHOS::AppExecFwk::EventHandler> mainHandler =
574 std::make_shared<OHOS::AppExecFwk::EventHandler>(OHOS::AppExecFwk::EventRunner::GetMainEventRunner());
575 if (mainHandler == nullptr) {
576 HILOGW("GetMainEventHandlerForFFRT execute fail, mainHandler is nullptr");
577 return nullptr;
578 }
579 return &mainHandler;
580 }
581
GetCurrentEventHandlerForFFRT()582 extern "C" void* GetCurrentEventHandlerForFFRT()
583 {
584 HILOGD("GetCurrentEventHandlerForFFRT enter");
585 thread_local std::shared_ptr<OHOS::AppExecFwk::EventHandler> currentHandler =
586 std::make_shared<OHOS::AppExecFwk::EventHandler>(OHOS::AppExecFwk::EventRunner::Current());
587 if (currentHandler == nullptr) {
588 HILOGW("GetCurrentEventHandlerForFFRT execute fail, currentHandler is nullptr");
589 return nullptr;
590 }
591 return ¤tHandler;
592 }
593
PostTaskByFFRT(void * handler,const std::function<void ()> & callback,const TaskOptions & task)594 extern "C" bool PostTaskByFFRT(void* handler, const std::function<void()>& callback, const TaskOptions &task)
595 {
596 HILOGD("PostTaskByFFRT enter");
597 if (handler == nullptr) {
598 HILOGW("PostTaskByFFRT execute fail, handler is nullptr");
599 return false;
600 }
601 std::shared_ptr<EventHandler>* ptr = reinterpret_cast<std::shared_ptr<EventHandler>*>(handler);
602 Caller caller = {};
603 caller.dfxName_ = task.dfxName_;
604 return (*ptr)->PostTask(callback, std::to_string(task.taskId_), task.delayTime_, task.priority_, caller);
605 }
606
PostSyncTaskByFFRT(void * handler,const std::function<void ()> & callback,const std::string & name,EventQueue::Priority priority)607 extern "C" bool PostSyncTaskByFFRT(void* handler, const std::function<void()>& callback,
608 const std::string &name, EventQueue::Priority priority)
609 {
610 HILOGD("PostSyncTaskByFFRT enter");
611 if (handler == nullptr) {
612 HILOGW("PostSyncTaskByFFRT execute fail, handler is nullptr");
613 return false;
614 }
615 std::shared_ptr<EventHandler>* ptr = reinterpret_cast<std::shared_ptr<EventHandler>*>(handler);
616 return (*ptr)->PostSyncTask(callback, name, priority);
617 }
618
RemoveTaskForFFRT(void * handler,const uintptr_t taskId)619 extern "C" int RemoveTaskForFFRT(void* handler, const uintptr_t taskId)
620 {
621 HILOGD("RemoveTaskForFFRT enter");
622 if (handler == nullptr) {
623 HILOGW("RemoveTaskForFFRT execute fail, handler is nullptr");
624 return FFRT_TASK_REMOVE_FAIL;
625 }
626 std::shared_ptr<EventHandler>* ptr = reinterpret_cast<std::shared_ptr<EventHandler>*>(handler);
627 return (*ptr)->RemoveTaskWithRet(std::to_string(taskId));
628 }
629
RemoveAllTaskForFFRT(void * handler)630 extern "C" void RemoveAllTaskForFFRT(void* handler)
631 {
632 HILOGD("RemoveAllTaskForFFRT enter");
633 if (handler == nullptr) {
634 HILOGW("RemoveAllTaskForFFRT execute fail, handler is nullptr");
635 return;
636 }
637 std::shared_ptr<EventHandler>* ptr = reinterpret_cast<std::shared_ptr<EventHandler>*>(handler);
638 (*ptr)->RemoveAllEvents();
639 }
640 } // namespace AppExecFwk
641 } // namespace OHOS
642