X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FScheduler.cc;h=e7550bb0a1467823746837e8b10935917bdce44e;hb=f52075dad8b8291570fa2c61ef9b5ec0a04d1e5e;hp=1d7b28bfaea5beea4496ed3b0f032a96eb37a4d3;hpb=ac90835cbb00ca83a51ab9efb23fdcb75518e808;p=senf.git diff --git a/Scheduler/Scheduler.cc b/Scheduler/Scheduler.cc index 1d7b28b..e7550bb 100644 --- a/Scheduler/Scheduler.cc +++ b/Scheduler/Scheduler.cc @@ -35,7 +35,6 @@ //#include "Scheduler.ih" // Custom includes -#include "SignalEvent.hh" #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// @@ -51,29 +50,42 @@ prefix_ void senf::scheduler::terminate() prefix_ void senf::scheduler::process() { - terminate_ = false; - while(! terminate_ && ! (detail::FdDispatcher::instance().empty() && - detail::TimerDispatcher::instance().empty() && - detail::FileDispatcher::instance().empty())) { + try { + detail::FIFORunner::instance().startWatchdog(); detail::SignalDispatcher::instance().unblockSignals(); detail::TimerDispatcher::instance().unblockSignals(); - detail::FdManager::instance().processOnce(); + terminate_ = false; + 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::FIFORunner::instance().run(); + } + } + catch(...) { detail::TimerDispatcher::instance().blockSignals(); detail::SignalDispatcher::instance().blockSignals(); - detail::FileDispatcher::instance().prepareRun(); - detail::FIFORunner::instance().run(); + detail::FIFORunner::instance().stopWatchdog(); + throw; } + detail::TimerDispatcher::instance().blockSignals(); + detail::SignalDispatcher::instance().blockSignals(); + detail::FIFORunner::instance().stopWatchdog(); } prefix_ void senf::scheduler::restart() { - 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::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(); sdd->~SignalDispatcher(); tdd->~TimerDispatcher(); @@ -87,6 +99,16 @@ prefix_ void senf::scheduler::restart() 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(); } ///////////////////////////////////////////////////////////////////////////