//#include "Scheduler.ih"
// Custom includes
-#include "SignalEvent.hh"
#define prefix_
///////////////////////////////cc.p////////////////////////////////////////
-prefix_ void senf::Scheduler::process()
+namespace {
+ bool terminate_ (false);
+}
+
+prefix_ void senf::scheduler::terminate()
+{
+ terminate_ = true;
+}
+
+namespace {
+
+ // We don't want try { } catch(...) { ... throw; } since that will make debugging more
+ // difficult: the stack backtrace for an unexpected exception would always end here.
+ struct SchedulerScopedInit
+ {
+ SchedulerScopedInit()
+ {
+ senf::scheduler::detail::FIFORunner::instance().startWatchdog();
+ senf::scheduler::detail::SignalDispatcher::instance().unblockSignals();
+ senf::scheduler::detail::TimerDispatcher::instance().enable();
+ }
+
+ ~SchedulerScopedInit()
+ {
+ senf::scheduler::detail::TimerDispatcher::instance().disable();
+ senf::scheduler::detail::SignalDispatcher::instance().blockSignals();
+ senf::scheduler::detail::FIFORunner::instance().stopWatchdog();
+ }
+ };
+}
+
+prefix_ void senf::scheduler::process()
{
+ SchedulerScopedInit initScheduler;
terminate_ = false;
- while(! terminate_ && ! (fdDispatcher_.empty() &&
- timerDispatcher_.empty() &&
- fileDispatcher_.empty())) {
- scheduler::detail::SignalDispatcher::instance().unblockSignals();
- timerDispatcher_.unblockSignals();
- scheduler::FdManager::instance().processOnce();
- timerDispatcher_.blockSignals();
- scheduler::detail::SignalDispatcher::instance().blockSignals();
- fileDispatcher_.prepareRun();
- scheduler::FIFORunner::instance().run();
+ 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();
}
}
-prefix_ void senf::Scheduler::restart()
+prefix_ void senf::scheduler::restart()
{
- scheduler::FdManager* fdm (&scheduler::FdManager::instance());
- scheduler::FIFORunner* ffr (&scheduler::FIFORunner::instance());
- scheduler::FdDispatcher* fdd (&fdDispatcher_);
- scheduler::TimerDispatcher* td (&timerDispatcher_);
- scheduler::detail::SignalDispatcher* sd (&scheduler::detail::SignalDispatcher::instance());
- scheduler::FileDispatcher* fld (&fileDispatcher_);
-
+ detail::FdManager* fdm (&detail::FdManager::instance());
+ detail::FIFORunner* ffr (&detail::FIFORunner::instance());
+ detail::FdDispatcher* fdd (&detail::FdDispatcher::instance());
+ detail::TimerDispatcher* tdd (&detail::TimerDispatcher::instance());
+ detail::SignalDispatcher* sdd (&detail::SignalDispatcher::instance());
+ detail::FileDispatcher* fld (&detail::FileDispatcher::instance());
+ detail::EventHookDispatcher* eed (&detail::EventHookDispatcher::instance());
+
+ eed->~EventHookDispatcher();
fld->~FileDispatcher();
- sd->~SignalDispatcher();
- td->~TimerDispatcher();
+ sdd->~SignalDispatcher();
+ tdd->~TimerDispatcher();
fdd->~FdDispatcher();
ffr->~FIFORunner();
fdm->~FdManager();
- new (fdm) scheduler::FdManager();
- new (ffr) scheduler::FIFORunner();
- new (fdd) scheduler::FdDispatcher(*fdm, *ffr);
- new (td) scheduler::TimerDispatcher(*fdm, *ffr);
- new (sd) scheduler::detail::SignalDispatcher();
- new (fld) scheduler::FileDispatcher(*fdm, *ffr);
+ new (fdm) detail::FdManager();
+ new (ffr) detail::FIFORunner();
+ new (fdd) detail::FdDispatcher();
+ new (tdd) detail::TimerDispatcher();
+ new (sdd) detail::SignalDispatcher();
+ new (fld) detail::FileDispatcher();
+ new (eed) detail::EventHookDispatcher();
+}
+
+prefix_ bool senf::scheduler::empty()
+{
+ return detail::FdDispatcher::instance().empty()
+ && detail::TimerDispatcher::instance().empty()
+ && detail::FileDispatcher::instance().empty()
+ && detail::SignalDispatcher::instance().empty()
+ && detail::EventHookDispatcher::instance().empty();
}
///////////////////////////////////////////////////////////////////////////
-// senf::SchedulerLogTimeSource
+// senf::schedulerLogTimeSource
-prefix_ senf::log::time_type senf::SchedulerLogTimeSource::operator()()
+prefix_ senf::log::time_type senf::scheduler::LogTimeSource::operator()()
const
{
- return Scheduler::instance().eventTime();
+ return eventTime();
}
///////////////////////////////cc.e////////////////////////////////////////