summaryrefslogtreecommitdiff
path: root/src/event_manager.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2013-01-14 19:07:38 +0100
committerMaxime Coste <frrrwww@gmail.com>2013-01-14 19:07:38 +0100
commit90eeb7b8a77a78a358234957624ea86cedc804f6 (patch)
tree2a51d5ba471142111be091665006831491d09272 /src/event_manager.cc
parenteaaf88db1d3561161dd4d519f3d5952539eaef04 (diff)
EventManager: add support for timers
Diffstat (limited to 'src/event_manager.cc')
-rw-r--r--src/event_manager.cc25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/event_manager.cc b/src/event_manager.cc
index 9ae3e78c..295bc622 100644
--- a/src/event_manager.cc
+++ b/src/event_manager.cc
@@ -16,6 +16,23 @@ FDWatcher::~FDWatcher()
EventManager::instance().m_fd_watchers.remove(this);
}
+Timer::Timer(TimePoint date, Callback callback)
+ : m_date{date}, m_callback{std::move(callback)}
+{
+ EventManager::instance().m_timers.add(this);
+}
+
+Timer::~Timer()
+{
+ EventManager::instance().m_timers.remove(this);
+}
+
+void Timer::run()
+{
+ m_date = TimePoint::max();
+ m_callback(*this);
+}
+
EventManager::EventManager()
{
m_forced_fd.reserve(4);
@@ -24,6 +41,7 @@ EventManager::EventManager()
EventManager::~EventManager()
{
assert(m_fd_watchers.empty());
+ assert(m_timers.empty());
}
void EventManager::handle_next_events()
@@ -48,6 +66,13 @@ void EventManager::handle_next_events()
(*it)->run();
}
}
+
+ TimePoint now = Clock::now();
+ for (auto& timer : m_timers)
+ {
+ if (timer->next_date() <= now)
+ timer->run();
+ }
}
void EventManager::force_signal(int fd)