From f2185d65187263a1cb47c999cb6852a2cce8ee87 Mon Sep 17 00:00:00 2001
From: g0dil <g0dil@wiback.org>
Date: Tue, 3 Feb 2009 09:31:02 +0000
Subject: [PATCH] Scheduler: Implement timer source switching API Scheduler:
 Switch default timer source to lores / epoll()

---
 Scheduler/Scheduler.cci  | 17 +++++++++++++++++
 Scheduler/Scheduler.hh   | 26 ++++++++++++++++++++++++++
 Scheduler/TimerEvent.cc  |  2 +-
 Scheduler/TimerEvent.cci |  6 ++++++
 Scheduler/TimerEvent.ih  |  2 ++
 5 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/Scheduler/Scheduler.cci b/Scheduler/Scheduler.cci
index 1e69ee1e..6f878617 100644
--- a/Scheduler/Scheduler.cci
+++ b/Scheduler/Scheduler.cci
@@ -54,6 +54,23 @@ prefix_ unsigned senf::scheduler::hangCount()
     return scheduler::detail::FIFORunner::instance().hangCount();
 }
 
+prefix_ void senf::scheduler::hiresTimers()
+{
+    detail::TimerDispatcher::instance().setTimerSource(
+        std::auto_ptr<TimerSource>(new POSIXTimerSource()));
+}
+
+prefix_ void senf::scheduler::loresTimers()
+{
+    detail::TimerDispatcher::instance().setTimerSource(
+        std::auto_ptr<TimerSource>(new PollTimerSource()));
+}
+
+prefix_ bool senf::scheduler::haveScalableHiresTimers()
+{
+    return false;
+}
+
 ///////////////////////////////cci.e///////////////////////////////////////
 #undef prefix_
 
diff --git a/Scheduler/Scheduler.hh b/Scheduler/Scheduler.hh
index a8cfe59f..fdd5f593 100644
--- a/Scheduler/Scheduler.hh
+++ b/Scheduler/Scheduler.hh
@@ -232,6 +232,32 @@ namespace scheduler {
     /** \brief Number of watchdog events */
     unsigned hangCount(); 
 
+    /** \brief Switch to using hi resolution timers
+        
+        By default, timers are implemented directly using epoll. This however restricts the timer
+        resolution to that of the kernel HZ value.
+
+        High resolution timers are implemented either using POSIX timers or, when available, using
+        the Linux special \c timerfd() syscall.
+
+        POSIX timers are delivered using signals. A high timer load this increases the signal load
+        considerably. \c timerfd()'s are delivered on a file descriptor and thus don't have such a
+        scalability issue.
+
+        \warning The timer source must not be switched from a scheduler callback
+     */
+    void hiresTimers();
+
+    /** \brief Switch back to using epoll for timing
+        \see hiresTimers()
+     */
+    void loresTimers();
+
+    /** \brief return \c true, if \c timerfd() timing is available, \c false otherwise
+        \see hiresTimers()
+     */
+    bool haveScalableHiresTimers();
+
     /** \brief Restart scheduler
         
         This call will restart all scheduler dispatchers (timers, signals, file descriptors). This
diff --git a/Scheduler/TimerEvent.cc b/Scheduler/TimerEvent.cc
index 38ad03ab..437aae34 100644
--- a/Scheduler/TimerEvent.cc
+++ b/Scheduler/TimerEvent.cc
@@ -34,7 +34,7 @@
 ///////////////////////////////cc.p////////////////////////////////////////
 
 prefix_ senf::scheduler::detail::TimerDispatcher::TimerDispatcher()
-    : source_ (new POSIXTimerSource())
+    : source_ (new PollTimerSource())
 {}
 
 prefix_ senf::scheduler::detail::TimerDispatcher::~TimerDispatcher()
diff --git a/Scheduler/TimerEvent.cci b/Scheduler/TimerEvent.cci
index 5fcf5ef5..e2bf3fbd 100644
--- a/Scheduler/TimerEvent.cci
+++ b/Scheduler/TimerEvent.cci
@@ -98,6 +98,12 @@ prefix_ bool senf::scheduler::detail::TimerDispatcher::empty()
     return timers_.empty();
 }
 
+prefix_ void senf::scheduler::detail::TimerDispatcher::
+setTimerSource(std::auto_ptr<TimerSource> timerSource)
+{
+    source_.reset(timerSource.release());
+}
+
 ///////////////////////////////cci.e///////////////////////////////////////
 #undef prefix_
 
diff --git a/Scheduler/TimerEvent.ih b/Scheduler/TimerEvent.ih
index af9c1047..a6ecf9b7 100644
--- a/Scheduler/TimerEvent.ih
+++ b/Scheduler/TimerEvent.ih
@@ -65,6 +65,8 @@ namespace detail {
 
         bool empty() const;
 
+        void setTimerSource(std::auto_ptr<TimerSource> timerSource);
+
     protected:
 
     private:
-- 
GitLab