diff options
author | sangwan.kwon <sangwan.kwon@samsung.com> | 2016-05-23 18:31:06 +0900 |
---|---|---|
committer | sangwan.kwon <sangwan.kwon@samsung.com> | 2016-05-24 10:54:40 +0900 |
commit | 2f1c4055b248447276cba35e1d4672f0e3d9e80a (patch) | |
tree | 83224dbdaf756c7a12d61102bccfbb98958b4165 /src/common/mainloop.cpp | |
parent | a43bd5dbc3e73ddedd55b79d7ffc06ac62e1a2fd (diff) | |
download | cert-checker-2f1c4055b248447276cba35e1d4672f0e3d9e80a.tar.gz cert-checker-2f1c4055b248447276cba35e1d4672f0e3d9e80a.tar.bz2 cert-checker-2f1c4055b248447276cba35e1d4672f0e3d9e80a.zip |
Add mainloop stop logic by using eventfd
Change-Id: If175379bebd20eeb60d091284f754857f59d34a7
Diffstat (limited to 'src/common/mainloop.cpp')
-rw-r--r-- | src/common/mainloop.cpp | 27 |
1 files changed, 23 insertions, 4 deletions
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); } |