diff --git a/frameworks/eventhandler/src/event_handler.cpp b/frameworks/eventhandler/src/event_handler.cpp index b5231a1eb449afd8325e968c2f450aa01ba045b4..367f2d4dcf4a59133ff2a651eb069948c1c6e68b 100644 --- a/frameworks/eventhandler/src/event_handler.cpp +++ b/frameworks/eventhandler/src/event_handler.cpp @@ -515,9 +515,79 @@ void EventHandler::DistributeEvent(const InnerEvent::Pointer &event) __attribute FinishTraceAdapter(); } +void DistributeEvent1(const InnerEvent::Pointer &event) __attribute__((no_sanitize("cfi"))) +{ + if (!event) { + HILOGE("Could not distribute an invalid event"); + return; + } + + currentEventHandler = shared_from_this(); + if (enableEventLog_) { + auto now = InnerEvent::Clock::now(); + HILOGD("start at %{public}s, event %{public}s, CurrentQueueSize %{public}s", + (InnerEvent::DumpTimeToString(now)).c_str(), (event->Dump()).c_str(), + (eventRunner_->GetEventQueue()->DumpCurrentQueueSize()).c_str()); + } + + StartTraceAdapter(event); + + auto spanId = event->GetTraceId(); + auto traceId = HiTraceChain::GetId(); + bool allowTraceOutPut = AllowHiTraceOutPut(spanId, event->HasWaiter()); + if (allowTraceOutPut) { + HiTraceChain::SetId(*spanId); + HiTracePointerOutPut(spanId, event, "Receive", HiTraceTracepointType::HITRACE_TP_SR); + } + + InnerEvent::TimePoint nowStart = InnerEvent::Clock::now(); + DeliveryTimeAction(event, nowStart); + HILOGD("EventName: %{public}s, eventId: %{public}s, priority: %{public}d", GetEventName(event).c_str(), + (event->GetEventUniqueId()).c_str(), event->GetEventPriority()); + + SetCurrentEventPriority(event->GetEventPriority()); + std::string eventName = GetEventName(event); + InnerEvent::TimePoint beginTime; + bool isAppMainThread = EventRunner::IsAppMainThread(); + if (EventRunner::distributeBegin_ && isAppMainThread) { + beginTime = EventRunner::distributeBegin_(eventName); + } + + if (event->HasTask()) { + // Call task callback directly if contains a task. + HILOGD("excute event taskCallback"); + (event->GetTaskCallback())(); + } else { + // Otherwise let developers to handle it. + ProcessEvent(event); + } + + if (EventRunner::distributeBegin_ && EventRunner::distributeEnd_ && isAppMainThread) { + EventRunner::distributeEnd_(eventName, beginTime); + DistributeTimeoutHandler(beginTime); + } + + DistributeTimeAction(event, nowStart); + + if (allowTraceOutPut) { + HiTraceChain::Tracepoint(HiTraceTracepointType::HITRACE_TP_SS, *spanId, "Event Distribute over"); + HiTraceChain::ClearId(); + if (traceId.IsValid()) { + HiTraceChain::SetId(traceId); + } + } + if (enableEventLog_) { + auto now = InnerEvent::Clock::now(); + HILOGD("end: %{public}s", InnerEvent::DumpTimeToString(now).c_str()); + } + FinishTraceAdapter(); +} + bool EventHandler::HasPendingHigherEvent(int32_t priority) { if (!eventRunner_ || !eventRunner_->GetEventQueue()) { + + return false; } if (priority < static_cast(AppExecFwk::EventQueue::Priority::VIP) || diff --git a/frameworks/eventhandler/test/unittest/lib_event_handler_event_queue_test.cpp b/frameworks/eventhandler/test/unittest/lib_event_handler_event_queue_test.cpp index 0db823bbb25f9bf62c29f14086be31d86585de49..712bd301ff1c555f95a5575784d13ac4395803d0 100644 --- a/frameworks/eventhandler/test/unittest/lib_event_handler_event_queue_test.cpp +++ b/frameworks/eventhandler/test/unittest/lib_event_handler_event_queue_test.cpp @@ -2862,4 +2862,98 @@ HWTEST_F(LibEventHandlerEventQueueTest, SetUsableTest_002, TestSize.Level1) auto event = InnerEvent::Get(f, "event"); auto result = queue.Insert(event); EXPECT_EQ(false, result); +} + +/* + * @tc.name: TransferInnerPriority_001 + * @tc.desc: TransferInnerPriority_001 test + * @tc.type: FUNC + */ +HWTEST_F(LibEventHandlerEventQueueTest, TransferInnerPriority_009, TestSize.Level1) +{ + /** + * @tc.setup: prepare queue. + */ + EventQueueFFRT queue; + queue.Prepare(); + + InnerEvent::Pointer event(nullptr, nullptr); + EventQueue::Priority priority; + EventInsertType insertType; + priority = EventQueue::Priority::VIP; + insertType = EventInsertType::AT_END; + queue.Insert(event, priority, insertType); + queue.InsertSyncEvent(event, priority, insertType); + queue.RemoveAll(); + std::shared_ptr owner = nullptr; + queue.Remove(owner); + queue.Remove(owner, 0); + queue.Remove(owner, 0, 0); + queue.Remove(owner, "test"); + uint32_t eventId = 0; + int64_t param = 0; + bool re = queue.HasInnerEvent(owner, eventId); + EXPECT_EQ(re, false); + bool re2 = queue.HasInnerEvent(owner, param); + EXPECT_EQ(re2, false); + DumpTest dumper; + queue.Dump(dumper); + std::string queueInfo; + queue.DumpQueueInfo(queueInfo); + bool re3 = queue.IsIdle(); + EXPECT_EQ(re3, true); + bool re4 = queue.IsQueueEmpty(); + EXPECT_EQ(re4, true); + std::string re5 = queue.DumpCurrentQueueSize(); + EXPECT_NE(re5, "test"); + int re6 = queue.HasPreferEvent(1); + EXPECT_EQ(re6, false); + queue.GetFfrtQueue(); +} + +/* + * @tc.name: TransferInnerPriority_001 + * @tc.desc: TransferInnerPriority_001 test + * @tc.type: FUNC + */ +HWTEST_F(LibEventHandlerEventQueueTest, TransferInnerPriority_008, TestSize.Level1) +{ + /** + * @tc.setup: prepare queue. + */ + EventQueueFFRT queue; + queue.Prepare(); + + InnerEvent::Pointer event(nullptr, nullptr); + EventQueue::Priority priority; + EventInsertType insertType; + priority = EventQueue::Priority::VIP; + insertType = EventInsertType::AT_END; + queue.Insert(event, priority, insertType); + queue.InsertSyncEvent(event, priority, insertType); + queue.RemoveAll(); + std::shared_ptr owner = nullptr; + queue.Remove(owner); + queue.Remove(owner, 0); + queue.Remove(owner, 0, 0); + queue.Remove(owner, "test"); + uint32_t eventId = 0; + int64_t param = 0; + bool re = queue.HasInnerEvent(owner, eventId); + EXPECT_EQ(re, false); + bool re2 = queue.HasInnerEvent(owner, param); + EXPECT_EQ(re2, false); + DumpTest dumper; + queue.Dump(dumper); + std::string queueInfo; + queue.DumpQueueInfo(queueInfo); + bool re3 = queue.IsIdle(); + EXPECT_EQ(re3, true); + bool re4 = queue.IsQueueEmpty(); + EXPECT_EQ(re4, true); + std::string re5 = queue.DumpCurrentQueueSize(); + EXPECT_NE(re5, "test"); + int re6 = queue.HasPreferEvent(1); + EXPECT_EQ(re6, false); + queue.GetFfrtQueue(); } \ No newline at end of file