X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FScheduler.cc;h=9ea0e481ea8f57df5f98fe04ae167e537c557761;hb=3863d46dd898b7bc35ea8c6ccd8563b18762a6b6;hp=246745936d7a3d516eb3dca76f3d9677a233366d;hpb=79e54eda6a7fb5ac3fa5b37f408dd386454c5bbd;p=senf.git diff --git a/Scheduler/Scheduler.cc b/Scheduler/Scheduler.cc index 2467459..9ea0e48 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,16 @@ prefix_ void senf::scheduler::terminate() terminate_ = true; } +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 @@ -58,14 +69,16 @@ namespace { { senf::scheduler::detail::FIFORunner::instance().startWatchdog(); senf::scheduler::detail::SignalDispatcher::instance().unblockSignals(); - senf::scheduler::detail::TimerDispatcher::instance().unblockSignals(); + senf::scheduler::detail::TimerDispatcher::instance().enable(); + running_ = true; } ~SchedulerScopedInit() { - senf::scheduler::detail::TimerDispatcher::instance().blockSignals(); + senf::scheduler::detail::TimerDispatcher::instance().disable(); senf::scheduler::detail::SignalDispatcher::instance().blockSignals(); senf::scheduler::detail::FIFORunner::instance().stopWatchdog(); + running_ = false; } }; } @@ -74,13 +87,17 @@ 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() && detail::FileDispatcher::instance().empty())) { detail::FdManager::instance().processOnce(); detail::FileDispatcher::instance().prepareRun(); detail::EventHookDispatcher::instance().prepareRun(); + detail::TimerDispatcher::instance().prepareRun(); detail::FIFORunner::instance().run(); + detail::TimerDispatcher::instance().reschedule(); } } @@ -120,6 +137,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 @@ -129,6 +158,33 @@ prefix_ senf::log::time_type senf::scheduler::LogTimeSource::operator()() return eventTime(); } +/////////////////////////////////////////////////////////////////////////// +// senf::scheduler::BlockSignals + +prefix_ senf::scheduler::BlockSignals::BlockSignals(bool initiallyBlocked) + : blocked_ (false) +{ + ::sigfillset(&allSigs_); + if (initiallyBlocked) + block(); +} + +prefix_ void senf::scheduler::BlockSignals::block() +{ + if (blocked_) + return; + ::sigprocmask(SIG_BLOCK, &allSigs_, &savedSigs_); + blocked_ = true; +} + +prefix_ void senf::scheduler::BlockSignals::unblock() +{ + if (!blocked_) + return; + ::sigprocmask(SIG_SETMASK, &savedSigs_, 0); + blocked_ = false; +} + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_