X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FScheduler.cc;h=3203d205e7f7d399ec67dc275a57575ea99bf291;hb=8057a9e389e33771aad9c78538f76d0e82ad7adb;hp=7d865230c912e1ddcbb3371b0fb91a936ef1af39;hpb=8bc8b29a3c4c1b32b14e17d17e3f6c3ff565c9e9;p=senf.git diff --git a/Scheduler/Scheduler.cc b/Scheduler/Scheduler.cc index 7d86523..3203d20 100644 --- a/Scheduler/Scheduler.cc +++ b/Scheduler/Scheduler.cc @@ -48,20 +48,42 @@ 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; + 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(); } } @@ -73,7 +95,7 @@ prefix_ void senf::scheduler::restart() 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();