diff --git a/base/src/event_demultiplexer.cpp b/base/src/event_demultiplexer.cpp index e4446845e83141b6471f61eeab4f63e6f49d7d82..87df8a71f0527960f537ad45991a12f199ccca61 100644 --- a/base/src/event_demultiplexer.cpp +++ b/base/src/event_demultiplexer.cpp @@ -70,7 +70,7 @@ uint32_t EventDemultiplexer::UpdateEventHandler(EventHandler* handler) std::lock_guard lock(mutex_); auto itor = eventHandlers_.find(handler->GetHandle()); if (itor == eventHandlers_.end()) { - eventHandlers_.insert(std::make_pair(handler->GetHandle(), handler->shared_from_this())); + eventHandlers_.insert(std::make_pair(handler->GetHandle(), handler)); return Update(EPOLL_CTL_ADD, handler); } @@ -79,7 +79,7 @@ uint32_t EventDemultiplexer::UpdateEventHandler(EventHandler* handler) return Update(EPOLL_CTL_DEL, handler); } - if (handler != itor->second.get()) { + if (handler != itor->second) { return TIMER_ERR_DEAL_FAILED; } return Update(EPOLL_CTL_MOD, handler); @@ -102,19 +102,7 @@ uint32_t EventDemultiplexer::Update(int operation, EventHandler* handler) void EventDemultiplexer::Polling(int timeout /* ms */) { - std::vector> holdHandlers; std::vector epollEvents(maxEvents_); - { - std::lock_guard lock(mutex_); - if (eventHandlers_.size() == 0) { - return; - } - - for (auto itor = eventHandlers_.begin(); itor != eventHandlers_.end();++itor) { - holdHandlers.emplace_back(itor->second); - } - } - int nfds = epoll_wait(epollFd_, &epollEvents[0], static_cast(epollEvents.size()), timeout); if (nfds == 0) { return; @@ -125,8 +113,8 @@ void EventDemultiplexer::Polling(int timeout /* ms */) } for (int idx = 0; idx < nfds; ++idx) { - void* ptr = epollEvents[idx].data.ptr; uint32_t events = epollEvents[idx].events; + void* ptr = epollEvents[idx].data.ptr; auto handler = reinterpret_cast(ptr); if (handler != nullptr) { handler->HandleEvents(Epoll2Reactor(events)); @@ -161,4 +149,4 @@ uint32_t EventDemultiplexer::Reactor2Epoll(uint32_t reactorEvent) } } -} \ No newline at end of file +} diff --git a/base/src/event_demultiplexer.h b/base/src/event_demultiplexer.h index 13fe966d42c2c7c5f7716e88d888a0094424df18..5c25e5663c090835009b9066f20ea6c67d439edc 100644 --- a/base/src/event_demultiplexer.h +++ b/base/src/event_demultiplexer.h @@ -17,7 +17,6 @@ #define UTILS_EVENT_DEMULTIPLEXER_H #include -#include #include #include @@ -48,7 +47,7 @@ private: int epollFd_; int maxEvents_; std::recursive_mutex mutex_; - std::map> eventHandlers_; // guard by mutex_ + std::map eventHandlers_; // guard by mutex_ }; } diff --git a/base/src/event_handler.h b/base/src/event_handler.h index 511bb6f8b93726194dbb1875becc22cfc2d91690..af75cbea09bfb1a381843b1cf5a9c7e43465c8da 100644 --- a/base/src/event_handler.h +++ b/base/src/event_handler.h @@ -19,15 +19,13 @@ #include #include #include -#include -#include namespace OHOS { namespace Utils { class EventReactor; -class EventHandler : public std::enable_shared_from_this { +class EventHandler { public: using Callback = std::function; diff --git a/base/src/timer.cpp b/base/src/timer.cpp index bb4db90a5564ef6a91ef00d435aac42501a0ae86..4fc9a1d074152cbc73e4f1d00eda49808412c82c 100644 --- a/base/src/timer.cpp +++ b/base/src/timer.cpp @@ -49,6 +49,14 @@ void Timer::Shutdown(bool useJoin) } reactor_->SwitchOff(); + if (timeoutMs_ == -1) { + std::lock_guard lock(mutex_); + if (intervalToTimers_.empty()) { + UTILS_LOGI("no event for epoll wait, use detach to shutdown"); + thread_.detach(); + return; + } + } if (!useJoin) { thread_.detach(); return; diff --git a/base/src/timer_event_handler.h b/base/src/timer_event_handler.h index 1fd0bd69c231c84d671c9b78b57a5e76b16b99e2..3201480b565c24485bf547ee8318f73ee90e9618 100644 --- a/base/src/timer_event_handler.h +++ b/base/src/timer_event_handler.h @@ -55,7 +55,7 @@ private: uint32_t interval_; EventReactor* reactor_; - std::shared_ptr handler_; + std::unique_ptr handler_; TimerCallback callback_; };