From 13cc6b65ce939e0e8df5df3062f104ae26d4a079 Mon Sep 17 00:00:00 2001 From: g0dil <g0dil@wiback.org> Date: Fri, 15 May 2009 15:17:47 +0000 Subject: [PATCH] Scheduler: Add scheduler timer latency test --- Scheduler/FIFORunner.cc | 2 ++ Scheduler/TimerEvent.hh | 1 + Scheduler/TimerEvent.test.cc | 63 ++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) diff --git a/Scheduler/FIFORunner.cc b/Scheduler/FIFORunner.cc index 2f37b9160..b57c66b84 100644 --- a/Scheduler/FIFORunner.cc +++ b/Scheduler/FIFORunner.cc @@ -89,6 +89,8 @@ prefix_ void senf::scheduler::detail::FIFORunner::startWatchdog() watchdogRunning_ = true; } + else + stopWatchdog(); } prefix_ void senf::scheduler::detail::FIFORunner::stopWatchdog() diff --git a/Scheduler/TimerEvent.hh b/Scheduler/TimerEvent.hh index 148fdcc00..d44cd50cf 100644 --- a/Scheduler/TimerEvent.hh +++ b/Scheduler/TimerEvent.hh @@ -116,6 +116,7 @@ namespace scheduler { \param[in] initiallyEnabled if set \c false, do not enable callback automatically. */ ClockService::clock_type timeout() const; + ///< Get current/last timeout value private: virtual void v_run(); diff --git a/Scheduler/TimerEvent.test.cc b/Scheduler/TimerEvent.test.cc index e7b614127..ff410e90c 100644 --- a/Scheduler/TimerEvent.test.cc +++ b/Scheduler/TimerEvent.test.cc @@ -29,9 +29,11 @@ // Custom includes #include "TimerEvent.hh" #include "Scheduler.hh" +#include <boost/bind.hpp> #include "../Utils//auto_unit_test.hh" #include <boost/test/test_tools.hpp> +#include <boost/random.hpp> #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// @@ -83,6 +85,67 @@ BOOST_AUTO_UNIT_TEST(timerDispatcher) } } +namespace { + + senf::ClockService::clock_type randomDelay() + { + static boost::uniform_smallint<> random (100,300); + static boost::mt19937 generator; + return senf::scheduler::now() + senf::ClockService::milliseconds(random(generator)); + } + + unsigned count (0); + senf::ClockService::clock_type delay (0); + + void jitterCb(senf::scheduler::TimerEvent & tm) + { + std::cerr << senf::scheduler::now() << ' ' << tm.timeout() << '\n'; + count ++; + delay += senf::scheduler::now() - tm.timeout(); + tm.timeout(randomDelay()); + } + + void logSchedulerTime() + { + std::cerr << senf::scheduler::now() << '\n'; + } + + void jitterTest() + { + count = 0; + delay = 0; + senf::scheduler::TimerEvent tm1 ("jitterTest::tm1", boost::bind(&jitterCb, boost::ref(tm1)), + randomDelay()); + senf::scheduler::TimerEvent tm2 ("jitterTest::tm2", boost::bind(&jitterCb, boost::ref(tm2)), + randomDelay()); + senf::scheduler::TimerEvent tm3 ("jitterTest::tm3", boost::bind(&jitterCb, boost::ref(tm3)), + randomDelay()); + + senf::scheduler::TimerEvent timeout("jitterTest::timeout", &senf::scheduler::terminate, + senf::scheduler::now() + senf::ClockService::seconds(5)); + + senf::scheduler::EventHook timerCalled ("jitterTest::logSchedulerTime", &logSchedulerTime, + senf::scheduler::EventHook::PRE); + + senf::scheduler::process(); + + std::cerr << "Average scheduling delay: " << delay/count << "\n"; + } + +} + +BOOST_AUTO_UNIT_TEST(timerJitter) +{ + senf::scheduler::watchdogTimeout(0); + std::cerr << "Epoll timers\n"; + senf::scheduler::loresTimers(); + jitterTest(); + std::cerr << "Hires timers\n"; + senf::scheduler::hiresTimers(); + jitterTest(); + senf::scheduler::watchdogTimeout(1000); +} + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ -- GitLab