X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FTimerEvent.test.cc;h=6a5704a7e17a16fe2e45f5947889c2463ff165e3;hb=bd9f9d3fd6fbcff0112a7bf48ab9284da9576b11;hp=b626944831394f5699877e0feb0f73a8ed44bfdb;hpb=ac90835cbb00ca83a51ab9efb23fdcb75518e808;p=senf.git diff --git a/Scheduler/TimerEvent.test.cc b/Scheduler/TimerEvent.test.cc index b626944..6a5704a 100644 --- a/Scheduler/TimerEvent.test.cc +++ b/Scheduler/TimerEvent.test.cc @@ -21,16 +21,19 @@ // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. /** \file - \brief TimerEvent.test unit tests */ + \brief TimerEvent unit tests */ //#include "TimerEvent.test.hh" //#include "TimerEvent.test.ih" // Custom includes #include "TimerEvent.hh" +#include "Scheduler.hh" +#include #include "../Utils//auto_unit_test.hh" #include +#include #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// @@ -61,10 +64,7 @@ BOOST_AUTO_UNIT_TEST(timerDispatcher) SENF_CHECK_NO_THROW( timer.disable() ); SENF_CHECK_NO_THROW( timer.enable() ); BOOST_CHECK( timer.enabled() ); - SENF_CHECK_NO_THROW( senf::scheduler::detail::TimerDispatcher::instance().unblockSignals() ); - SENF_CHECK_NO_THROW( senf::scheduler::detail::FdManager::instance().processOnce() ); - SENF_CHECK_NO_THROW( senf::scheduler::detail::TimerDispatcher::instance().blockSignals() ); - SENF_CHECK_NO_THROW( senf::scheduler::detail::FIFORunner::instance().run() ); + SENF_CHECK_NO_THROW( senf::scheduler::process() ); senf::ClockService::clock_type t2 (senf::ClockService::now()); BOOST_CHECK( called ); BOOST_CHECK( ! timer.enabled() ); @@ -74,15 +74,98 @@ BOOST_AUTO_UNIT_TEST(timerDispatcher) t = senf::ClockService::now(); SENF_CHECK_NO_THROW( timer.timeout(t) ); BOOST_CHECK( timer.enabled() ); - SENF_CHECK_NO_THROW( senf::scheduler::detail::TimerDispatcher::instance().unblockSignals() ); + SENF_CHECK_NO_THROW( senf::scheduler::detail::TimerDispatcher::instance().enable() ); + SENF_CHECK_NO_THROW( senf::scheduler::detail::TimerDispatcher::instance().reschedule() ); SENF_CHECK_NO_THROW( senf::scheduler::detail::FdManager::instance().processOnce() ); - SENF_CHECK_NO_THROW( senf::scheduler::detail::TimerDispatcher::instance().blockSignals() ); + SENF_CHECK_NO_THROW( senf::scheduler::detail::TimerDispatcher::instance().prepareRun() ); SENF_CHECK_NO_THROW( senf::scheduler::detail::FIFORunner::instance().run() ); + SENF_CHECK_NO_THROW( senf::scheduler::detail::TimerDispatcher::instance().disable() ); BOOST_CHECK_PREDICATE( is_close, (t) (senf::ClockService::now()) ); BOOST_CHECK( called ); } } +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); + bool haveCb (false); + + void jitterCb(senf::scheduler::TimerEvent & tm) + { + //std::cerr << "diff:" << senf::ClockService::in_microseconds( senf::scheduler::now() - tm.timeout()) << '\n'; + count ++; + delay += senf::ClockService::in_microseconds( senf::scheduler::now() - tm.timeout()); + haveCb = true; + tm.timeout(randomDelay()); + } + + void preCb() + { + haveCb = false; + } + + void postCb() + { + if (! haveCb) + std::cerr << senf::scheduler::now() << '\n'; + } + + void idleCb(senf::scheduler::TimerEvent & tm) + { + tm.timeout( senf::scheduler::now()); + } + + void jitterTest() + { + count = 0; + delay = 0; +// senf::scheduler::EventHook pre ("jitterTest::preCb", &preCb, +// senf::scheduler::EventHook::PRE); +// senf::scheduler::EventHook post ("jitterTest::postCb", &postCb, +// senf::scheduler::EventHook::POST); + + 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()); + + // enabled "Idle"-Event will degrade scheduling delay + //senf::scheduler::TimerEvent idle ( + // "jitterTest::idle", boost::bind(&idleCb, boost::ref(idle)), senf::scheduler::now()); + + senf::scheduler::TimerEvent timeout("jitterTest::timeout", &senf::scheduler::terminate, + senf::scheduler::now() + senf::ClockService::seconds(5)); + + senf::scheduler::process(); + + std::cerr << "Average scheduling delay: " << delay/count << " microseconds\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::loresTimers(); + senf::scheduler::watchdogTimeout(1000); +} + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_