From b9cfdf6b448afaf0f633344aaecfe16257c4613b Mon Sep 17 00:00:00 2001 From: chenkeyu Date: Sun, 6 Oct 2024 11:02:28 +0800 Subject: [PATCH] add epoll_wait exit when unrecoverable error occure Issue: https://gitee.com/openharmony/commonlibrary_c_utils/issues/IAUMMJ?from=project-issue Signed-off-by: chenkeyu --- base/src/event_demultiplexer.cpp | 13 ++++++++++--- base/src/event_demultiplexer.h | 2 +- base/src/event_reactor.cpp | 5 ++++- base/src/event_reactor.h | 2 ++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/base/src/event_demultiplexer.cpp b/base/src/event_demultiplexer.cpp index 68c5190..60678ec 100644 --- a/base/src/event_demultiplexer.cpp +++ b/base/src/event_demultiplexer.cpp @@ -32,6 +32,8 @@ static const int EPOLL_MAX_EVENS_INIT = 8; static const int HALF_OF_MAX_EVENT = 2; static const int EPOLL_INVALID_FD = -1; static const int INTERRUPTED_SYS_CALL = 4; +static const int EPOLL_ERROR_BADF = 9; +static const int EPOLL_ERROR_EINVAL = 22; EventDemultiplexer::EventDemultiplexer() : epollFd_(epoll_create1(EPOLL_CLOEXEC)), maxEvents_(EPOLL_MAX_EVENS_INIT), mutex_(), eventHandlers_() @@ -101,7 +103,7 @@ uint32_t EventDemultiplexer::Update(int operation, EventHandler* handler) return TIMER_ERR_OK; } -void EventDemultiplexer::Polling(int timeout /* ms */) +int EventDemultiplexer::Polling(int timeout /* ms */) { std::vector epollEvents(maxEvents_); std::vector> taskQue; @@ -109,13 +111,17 @@ void EventDemultiplexer::Polling(int timeout /* ms */) int nfds = epoll_wait(epollFd_, &epollEvents[0], static_cast(epollEvents.size()), timeout); if (nfds == 0) { - return; + return nfds; } if (nfds == -1) { if (errno != INTERRUPTED_SYS_CALL) { UTILS_LOGE("epoll_wait failed, errno %{public}d", errno); } - return; + if (errno == EPOLL_ERROR_BADF || errno == EPOLL_ERROR_EINVAL) { + UTILS_LOGE("epoll_wait critical error, thread exit"); + return EPOLL_CRITICAL_ERROR; + } + return nfds; } { @@ -141,6 +147,7 @@ void EventDemultiplexer::Polling(int timeout /* ms */) if (nfds == maxEvents_) { maxEvents_ *= HALF_OF_MAX_EVENT; } + return nfds; } uint32_t EventDemultiplexer::Epoll2Reactor(uint32_t epollEvents) diff --git a/base/src/event_demultiplexer.h b/base/src/event_demultiplexer.h index 13fe966..75a3d7b 100644 --- a/base/src/event_demultiplexer.h +++ b/base/src/event_demultiplexer.h @@ -36,7 +36,7 @@ public: uint32_t StartUp(); void CleanUp(); - void Polling(int timeout); + int Polling(int timeout); uint32_t UpdateEventHandler(EventHandler* handler); diff --git a/base/src/event_reactor.cpp b/base/src/event_reactor.cpp index f04d61f..59fb615 100644 --- a/base/src/event_reactor.cpp +++ b/base/src/event_reactor.cpp @@ -76,7 +76,10 @@ void EventReactor::RunLoop(int timeout) const } while (loopReady_ && switch_) { - demultiplexer_->Polling(timeout); + if (demultiplexer_->Polling(timeout) == EPOLL_CRITICAL_ERROR) { + UTILS_LOGE("polling critical error occure: %{public}d", timeout); + break; + } } loopReady_ = false; diff --git a/base/src/event_reactor.h b/base/src/event_reactor.h index 83139bd..c27567a 100644 --- a/base/src/event_reactor.h +++ b/base/src/event_reactor.h @@ -25,6 +25,8 @@ namespace OHOS { namespace Utils { +#define EPOLL_CRITICAL_ERROR (-10) + class EventDemultiplexer; class EventHandler; class TimerEventHandler; -- Gitee