diff --git a/base/src/event_demultiplexer.cpp b/base/src/event_demultiplexer.cpp index 68c51908fea5476d602f78d5f22c6238b3b95457..60678eccadfde93dcf93c5bde92d6391a6447d93 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 13fe966d42c2c7c5f7716e88d888a0094424df18..75a3d7b0fa56bcc0fabe8914d317e892bfa389be 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 f04d61f99a24e896140a6111514f095f57be1ae0..59fb61527beed8ce0cce8244afb4a048b97f0a30 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 83139bdc6277a4153a068696ddcba0d504cc7d26..c27567a55802af57fb90a82d9a489dc769b75ca8 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;