summaryrefslogtreecommitdiff
path: root/src/common/mainloop.cpp
diff options
context:
space:
mode:
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);
}