From 2f1c4055b248447276cba35e1d4672f0e3d9e80a Mon Sep 17 00:00:00 2001 From: "sangwan.kwon" Date: Mon, 23 May 2016 18:31:06 +0900 Subject: Add mainloop stop logic by using eventfd Change-Id: If175379bebd20eeb60d091284f754857f59d34a7 --- src/common/mainloop.cpp | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) (limited to 'src/common/mainloop.cpp') diff --git a/src/common/mainloop.cpp b/src/common/mainloop.cpp index 4e0f7dd..8ce7326 100644 --- a/src/common/mainloop.cpp +++ b/src/common/mainloop.cpp @@ -16,6 +16,7 @@ /* * @file mainloop.cpp * @author Kyungwook Tak (k.tak@samsung.com) + * @author Sangwan Kwon (sangwan.kwon@samsung.com) * @version 1.0 * @brief Mainloop with epoll */ @@ -33,7 +34,8 @@ namespace CCHECKER { Mainloop::Mainloop() : m_isTimedOut(false), - m_pollfd(::epoll_create1(EPOLL_CLOEXEC)) + m_pollfd(::epoll_create1(EPOLL_CLOEXEC)), + m_stopped(false) { if (m_pollfd == -1) throw std::system_error( @@ -43,18 +45,35 @@ Mainloop::Mainloop() : Mainloop::~Mainloop() { - if (!m_isTimedOut && !m_callbacks.empty()) + if (!m_stopped && !m_isTimedOut && !m_callbacks.empty()) throw std::logic_error("mainloop registered callbacks should be empty " - "except timed out case"); + "except timed out case"); ::close(m_pollfd); } +void Mainloop::stop() +{ + m_stopped = true; + wakeupSignal.send(); +} + +void Mainloop::prepare() +{ + auto wakeupMainloop = [&](uint32_t) { + wakeupSignal.receive(); + removeEventSource(wakeupSignal.getFd()); + }; + + addEventSource(wakeupSignal.getFd(), EPOLLIN, std::move(wakeupMainloop)); +} + void Mainloop::run(int timeout) { + prepare(); m_isTimedOut = false; - while (!m_isTimedOut) { + while (!m_isTimedOut && !m_stopped) { dispatch(timeout); } -- cgit v1.2.3