summaryrefslogtreecommitdiff
path: root/src/common/mainloop.cpp
diff options
context:
space:
mode:
authorsangwan.kwon <sangwan.kwon@samsung.com>2016-05-23 18:31:06 +0900
committersangwan.kwon <sangwan.kwon@samsung.com>2016-05-24 10:54:40 +0900
commit2f1c4055b248447276cba35e1d4672f0e3d9e80a (patch)
tree83224dbdaf756c7a12d61102bccfbb98958b4165 /src/common/mainloop.cpp
parenta43bd5dbc3e73ddedd55b79d7ffc06ac62e1a2fd (diff)
downloadcert-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.cpp27
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);
}