From d609cd59f0af885c69d46672c844321a6aeff57c Mon Sep 17 00:00:00 2001 From: chenkeyu Date: Tue, 8 Apr 2025 11:56:41 +0800 Subject: [PATCH] Optimize events vector for epoll Issue: https://gitee.com/openharmony/commonlibrary_c_utils/issues/IBZBN6?from=project-issue Signed-off-by: chenkeyu --- base/src/event_demultiplexer.cpp | 4 ++-- base/src/event_demultiplexer.h | 6 +++++- base/src/event_reactor.cpp | 3 ++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/base/src/event_demultiplexer.cpp b/base/src/event_demultiplexer.cpp index 34c109e..a42958f 100644 --- a/base/src/event_demultiplexer.cpp +++ b/base/src/event_demultiplexer.cpp @@ -106,9 +106,8 @@ uint32_t EventDemultiplexer::Update(int operation, EventHandler* handler) return TIMER_ERR_OK; } -int EventDemultiplexer::Polling(int timeout /* ms */) +int EventDemultiplexer::Polling(int timeout /* ms */, std::vector& epollEvents) { - std::vector epollEvents(maxEvents_); std::vector> taskQue; std::vector eventQue; @@ -156,6 +155,7 @@ int EventDemultiplexer::Polling(int timeout /* ms */) if (nfds == maxEvents_) { maxEvents_ *= HALF_OF_MAX_EVENT; + epollEvents.resize(maxEvents_); } return nfds; } diff --git a/base/src/event_demultiplexer.h b/base/src/event_demultiplexer.h index 02b2d9a..3aea06e 100644 --- a/base/src/event_demultiplexer.h +++ b/base/src/event_demultiplexer.h @@ -22,6 +22,8 @@ #include #include #include +#include +#include namespace OHOS { namespace Utils { @@ -38,10 +40,12 @@ public: uint32_t StartUp(); void CleanUp(); - int Polling(int timeout); + int Polling(int timeout, std::vector& epollEvents); uint32_t UpdateEventHandler(EventHandler* handler); + int GetMaxEvents() const { return maxEvents_; } + private: uint32_t Update(int operation, EventHandler* handler); static uint32_t Reactor2Epoll(uint32_t reactorEvent); diff --git a/base/src/event_reactor.cpp b/base/src/event_reactor.cpp index c61471c..ba06a8c 100644 --- a/base/src/event_reactor.cpp +++ b/base/src/event_reactor.cpp @@ -71,8 +71,9 @@ void EventReactor::RunLoop(int timeout) const return; } + std::vector epollEvents(demultiplexer_->GetMaxEvents()); while (loopReady_ && switch_) { - if (demultiplexer_->Polling(timeout) == EPOLL_CRITICAL_ERROR) { + if (demultiplexer_->Polling(timeout, epollEvents) == EPOLL_CRITICAL_ERROR) { UTILS_LOGD("polling critical error occure: %{public}d", timeout); break; } -- Gitee