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