namespace {
bool terminate_ (false);
+ bool running_ (false);
}
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
senf::scheduler::detail::FIFORunner::instance().startWatchdog();
senf::scheduler::detail::SignalDispatcher::instance().unblockSignals();
senf::scheduler::detail::TimerDispatcher::instance().enable();
+ running_ = true;
}
~SchedulerScopedInit()
senf::scheduler::detail::TimerDispatcher::instance().disable();
senf::scheduler::detail::SignalDispatcher::instance().blockSignals();
senf::scheduler::detail::FIFORunner::instance().stopWatchdog();
+ running_ = false;
}
};
}
detail::TimerDispatcher::instance().reschedule();
while(! terminate_ && ! (detail::FdDispatcher::instance().empty() &&
detail::TimerDispatcher::instance().empty() &&
- detail::FileDispatcher::instance().empty())) {
+ detail::FileDispatcher::instance().empty() &&
+ detail::IdleEventDispatcher::instance().empty()) ) {
detail::FdManager::instance().processOnce();
detail::FileDispatcher::instance().prepareRun();
detail::EventHookDispatcher::instance().prepareRun();
detail::TimerDispatcher::instance().prepareRun();
+ detail::IdleEventDispatcher::instance().prepareRun();
detail::FIFORunner::instance().run();
detail::TimerDispatcher::instance().reschedule();
}
detail::TimerDispatcher* tdd (&detail::TimerDispatcher::instance());
detail::SignalDispatcher* sdd (&detail::SignalDispatcher::instance());
detail::FileDispatcher* fld (&detail::FileDispatcher::instance());
+ detail::IdleEventDispatcher* ied (&detail::IdleEventDispatcher::instance());
detail::EventHookDispatcher* eed (&detail::EventHookDispatcher::instance());
eed->~EventHookDispatcher();
+ ied->~IdleEventDispatcher();
fld->~FileDispatcher();
sdd->~SignalDispatcher();
tdd->~TimerDispatcher();
new (tdd) detail::TimerDispatcher();
new (sdd) detail::SignalDispatcher();
new (fld) detail::FileDispatcher();
+ new (ied) detail::IdleEventDispatcher();
new (eed) detail::EventHookDispatcher();
}
&& detail::TimerDispatcher::instance().empty()
&& detail::FileDispatcher::instance().empty()
&& detail::SignalDispatcher::instance().empty()
+ && detail::IdleEventDispatcher::instance().empty()
&& detail::EventHookDispatcher::instance().empty();
}
+prefix_ void senf::scheduler::hiresTimers()
+{
+#ifdef HAVE_TIMERFD
+ if (haveScalableHiresTimers())
+ detail::TimerDispatcher::instance().timerSource(
+ std::auto_ptr<detail::TimerSource>(new detail::TimerFDTimerSource()));
+ else
+#endif
+ detail::TimerDispatcher::instance().timerSource(
+ std::auto_ptr<detail::TimerSource>(new detail::POSIXTimerSource()));
+}
+
///////////////////////////////////////////////////////////////////////////
// senf::schedulerLogTimeSource
prefix_ senf::log::time_type senf::scheduler::LogTimeSource::operator()()
const
{
- return eventTime();
+ return senf::scheduler::now();
}
///////////////////////////////////////////////////////////////////////////