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