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;
+ detail::TimerDispatcher::instance().reschedule();
while(! terminate_ && ! (detail::FdDispatcher::instance().empty() &&
detail::TimerDispatcher::instance().empty() &&
detail::FileDispatcher::instance().empty())) {
- detail::SignalDispatcher::instance().unblockSignals();
- detail::TimerDispatcher::instance().unblockSignals();
detail::FdManager::instance().processOnce();
- detail::TimerDispatcher::instance().blockSignals();
- detail::SignalDispatcher::instance().blockSignals();
detail::FileDispatcher::instance().prepareRun();
detail::EventHookDispatcher::instance().prepareRun();
+ detail::TimerDispatcher::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::EventHookDispatcher* eed (&detail::EventHookDispatcher::instance());
+ detail::EventHookDispatcher* eed (&detail::EventHookDispatcher::instance());
eed->~EventHookDispatcher();
fld->~FileDispatcher();