diff --git a/frameworks/eventhandler/include/deamon_io_waiter.h b/frameworks/eventhandler/include/deamon_io_waiter.h index d52315d0edd11e0b50c26306b560a60ae98b18e7..3edae18c4e9a3424466041f8ea5869eea208f1f5 100644 --- a/frameworks/eventhandler/include/deamon_io_waiter.h +++ b/frameworks/eventhandler/include/deamon_io_waiter.h @@ -61,6 +61,7 @@ public: LOCAL_API void EraseFileDescriptorMap(int32_t fileDescriptor); LOCAL_API std::shared_ptr GetFileDescriptorMap(int32_t fileDescriptor); LOCAL_API void HandleFileDescriptorEvent(int32_t fileDescriptor, uint32_t events); + LOCAL_API void VsyncReport(const std::shared_ptr &handler); private: LOCAL_API void EpollWaitFor(); LOCAL_API void DrainAwakenPipe() const; diff --git a/frameworks/eventhandler/src/deamon_io_waiter.cpp b/frameworks/eventhandler/src/deamon_io_waiter.cpp index 2ac5c9e87c9be61d8d8e8ace20bfc75b65d85701..737111e4fad409387472f15cd5935688bd310490 100644 --- a/frameworks/eventhandler/src/deamon_io_waiter.cpp +++ b/frameworks/eventhandler/src/deamon_io_waiter.cpp @@ -148,6 +148,18 @@ void DeamonIoWaiter::StopEpollIoWaiter() running_.store(false); } +void DeamonIoWaiter::VsyncReport(const std::shared_ptr &handler) +{ + auto runner = handler->GetEventRunner(); + if (!runner) { + return; + } + + if (runner == EventRunner::GetMainEventRunner()) { + FrameReport::GetInstance().ReportSchedEvent(FrameSchedEvent::UI_EVENT_HANDLE_BEGIN, {}); + } +} + void DeamonIoWaiter::HandleFileDescriptorEvent(int32_t fileDescriptor, uint32_t events) __attribute__((no_sanitize("cfi"))) { @@ -159,6 +171,11 @@ void DeamonIoWaiter::HandleFileDescriptorEvent(int32_t fileDescriptor, uint32_t return; } + if (fileDescriptorInfo->taskName_ == "vSyncTask") { + VsyncReport(handler); + return; + } + std::weak_ptr wp = fileDescriptorInfo->listener_; auto f = [fileDescriptor, events, wp]() { auto listener = wp.lock(); diff --git a/frameworks/eventhandler/src/event_queue.cpp b/frameworks/eventhandler/src/event_queue.cpp index 2c360addca685f63a8fcbe56aca233c723a4eb25..238894646534c5ae9cabeb5fa935c02cab808a2e 100644 --- a/frameworks/eventhandler/src/event_queue.cpp +++ b/frameworks/eventhandler/src/event_queue.cpp @@ -121,6 +121,10 @@ bool EventQueue::AddFileDescriptorByFd(int32_t fileDescriptor, uint32_t events, listener, priority); } if (ioWaiter_) { + auto handler = listener->GetOwner(); + if (taskName == "vSyncTask" && handler->GetEventRunner() == EventRunner::GetMainEventRunner()) { + DeamonIoWaiter::GetInstance().AddFileDescriptor(fileDescriptor, events, taskName, listener, priority); + } return ioWaiter_->AddFileDescriptor(fileDescriptor, events, taskName, listener, priority); } return false; @@ -207,7 +211,6 @@ static void PostTaskForVsync(const InnerEvent::Callback &cb, const std::string & handler->RemoveTask("BarrierEvent"); queue->SetBarrierMode(false); } - FrameReport::GetInstance().ReportSchedEvent(FrameSchedEvent::UI_EVENT_HANDLE_BEGIN, {}); } std::shared_ptr EventQueue::GetListenerByfd(int32_t fileDescriptor) @@ -278,9 +281,6 @@ void EventQueue::HandleFileDescriptorEvent(int32_t fileDescriptor, uint32_t even } else { handler->PostTask(f, taskName, 0, priority); } - if (taskName == "vSyncTask" && handler->GetEventRunner() == EventRunner::GetMainEventRunner()) { - FrameReport::GetInstance().ReportSchedEvent(FrameSchedEvent::UI_FLUSH_BEGIN, {}); - } } void EventQueue::RemoveListenerByOwner(const std::shared_ptr &owner) diff --git a/frameworks/eventhandler/test/BUILD.gn b/frameworks/eventhandler/test/BUILD.gn index 6be5974b33d64a8b6a7f7a3a1aafc9bd4c23b253..38728eb661f3485562fc738360428b442f8f16d1 100644 --- a/frameworks/eventhandler/test/BUILD.gn +++ b/frameworks/eventhandler/test/BUILD.gn @@ -38,7 +38,11 @@ ohos_unittest("LibEventHandlerEpollIoWaiterTest") { "init:libbegetutil", ] - cflags_cc = [ "-DFFRT_USAGE_ENABLE" ] + cflags_cc = [ + "-DFFRT_USAGE_ENABLE", + "-Dprivate=public", + ] + if (has_hichecker_native_part) { external_deps += [ "hichecker:libhichecker" ] } diff --git a/frameworks/eventhandler/test/unittest/lib_event_epoll_io_waiter_test.cpp b/frameworks/eventhandler/test/unittest/lib_event_epoll_io_waiter_test.cpp index 18429e7dc6837c6c2a9633da6dfa590c6115724e..c5ee57ba1f1fa4cd3b2e535b7db1c818e243453d 100644 --- a/frameworks/eventhandler/test/unittest/lib_event_epoll_io_waiter_test.cpp +++ b/frameworks/eventhandler/test/unittest/lib_event_epoll_io_waiter_test.cpp @@ -155,6 +155,34 @@ HWTEST_F(LibEventHandlerEpollIoWaiterTest, AddFileDescriptor003, TestSize.Level1 EXPECT_EQ(result, false); } +HWTEST_F(LibEventHandlerEpollIoWaiterTest, VsyncReport001, TestSize.Level1) +{ + /** + * @tc.steps: step1. get event with event id and param, then get event id and param from event. + * @tc.expected: step1. the event id and param is the same as we set. + */ + + DeamonIoWaiter::GetInstance().Init(); + auto runner1 = EventRunner::Create(false); + auto handler1 = std::make_shared(runner1); + DeamonIoWaiter::GetInstance().VsyncReport(handler1); + EXPECT_NE(handler1->GetEventRunner(), nullptr); + usleep(500); + + auto runner2 = EventRunner::Create(true); + auto handler2 = std::make_shared(runner2); + handler2->eventRunner_ = nullptr; + DeamonIoWaiter::GetInstance().VsyncReport(handler2); + EXPECT_EQ(handler2->GetEventRunner(), nullptr); + usleep(500); + + auto runner3 = EventRunner::Create(true); + auto handler3 = std::make_shared(runner3); + DeamonIoWaiter::GetInstance().VsyncReport(handler3); + EXPECT_NE(handler3->GetEventRunner(), nullptr); + usleep(500); +} + HWTEST_F(LibEventHandlerEpollIoWaiterTest, PostTaskForVsync001, TestSize.Level1) { /** @@ -185,6 +213,19 @@ HWTEST_F(LibEventHandlerEpollIoWaiterTest, PostTaskForVsync001, TestSize.Level1) FILE_DESCRIPTOR_SHUTDOWN_EVENT | FILE_DESCRIPTOR_EXCEPTION_EVENT; DeamonIoWaiter::GetInstance().HandleFileDescriptorEvent(fileDescriptor, events); usleep(500); + + int32_t fileDescriptor2 = 2; + uint32_t events2 = 2; + auto runner2 = EventRunner::Create(true); + auto handler2 = std::make_shared(runner2); + auto listener2 = std::make_shared(); + handler2->AddFileDescriptorListener(fileDescriptor2, events2, + listener2, "vSyncTask", EventQueue::Priority::VIP); + bool result2 = DeamonIoWaiter::GetInstance().AddFileDescriptor(fileDescriptor2, + events2, "vSyncTask", listener2, EventQueue::Priority::VIP); + EXPECT_EQ(result2, false); + DeamonIoWaiter::GetInstance().HandleFileDescriptorEvent(fileDescriptor2, events2); + usleep(500); } /*