X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FScheduler.cc;h=a79307ac5ca989e8ccc909552429e078672dcb0b;hb=bd9f9d3fd6fbcff0112a7bf48ab9284da9576b11;hp=f40bf69803814562e0ff9b42786609c789859e7a;hpb=b5d7667a0ee87f023a74df607b582b976241dcf7;p=senf.git diff --git a/Scheduler/Scheduler.cc b/Scheduler/Scheduler.cc index f40bf69..a79307a 100644 --- a/Scheduler/Scheduler.cc +++ b/Scheduler/Scheduler.cc @@ -41,6 +41,7 @@ namespace { bool terminate_ (false); + bool running_ (false); } prefix_ void senf::scheduler::terminate() @@ -48,6 +49,21 @@ prefix_ void senf::scheduler::terminate() terminate_ = true; } +prefix_ void senf::scheduler::yield() +{ + senf::scheduler::detail::FIFORunner::instance().yield(); +} + +prefix_ bool senf::scheduler::running() +{ + return running_; +} + +prefix_ senf::ClockService::clock_type senf::scheduler::now() +{ + return running() ? eventTime() : ClockService::now(); +} + namespace { // We don't want try { } catch(...) { ... throw; } since that will make debugging more @@ -59,6 +75,7 @@ namespace { senf::scheduler::detail::FIFORunner::instance().startWatchdog(); senf::scheduler::detail::SignalDispatcher::instance().unblockSignals(); senf::scheduler::detail::TimerDispatcher::instance().enable(); + running_ = true; } ~SchedulerScopedInit() @@ -66,6 +83,7 @@ namespace { senf::scheduler::detail::TimerDispatcher::instance().disable(); senf::scheduler::detail::SignalDispatcher::instance().blockSignals(); senf::scheduler::detail::FIFORunner::instance().stopWatchdog(); + running_ = false; } }; } @@ -74,6 +92,7 @@ prefix_ void senf::scheduler::process() { SchedulerScopedInit initScheduler; terminate_ = false; + running_ = true; detail::TimerDispatcher::instance().reschedule(); while(! terminate_ && ! (detail::FdDispatcher::instance().empty() && detail::TimerDispatcher::instance().empty() && @@ -123,6 +142,18 @@ prefix_ bool senf::scheduler::empty() && detail::EventHookDispatcher::instance().empty(); } +prefix_ void senf::scheduler::hiresTimers() +{ +#ifdef HAVE_TIMERFD + if (haveScalableHiresTimers()) + detail::TimerDispatcher::instance().timerSource( + std::auto_ptr(new detail::TimerFDTimerSource())); + else +#endif + detail::TimerDispatcher::instance().timerSource( + std::auto_ptr(new detail::POSIXTimerSource())); +} + /////////////////////////////////////////////////////////////////////////// // senf::schedulerLogTimeSource