X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FScheduler.cc;h=7d865230c912e1ddcbb3371b0fb91a936ef1af39;hb=c77d350c7bb263316c35f535542cdeaec3d2aab6;hp=02364a42760922ddcb068d1598ca1f6896de32e7;hpb=40fa3e3f1e0f639c68bd15bf469e35045f94abee;p=senf.git diff --git a/Scheduler/Scheduler.cc b/Scheduler/Scheduler.cc index 02364a4..7d86523 100644 --- a/Scheduler/Scheduler.cc +++ b/Scheduler/Scheduler.cc @@ -39,29 +39,75 @@ #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// -prefix_ void senf::Scheduler::process() +namespace { + bool terminate_ (false); +} + +prefix_ void senf::scheduler::terminate() +{ + terminate_ = true; +} + +prefix_ void senf::scheduler::process() { terminate_ = false; - while(! terminate_ && ! (fdDispatcher_.empty() && - timerDispatcher_.empty() && - fileDispatcher_.empty())) { - signalDispatcher_.unblockSignals(); - timerDispatcher_.unblockSignals(); - manager_.processOnce(); - timerDispatcher_.blockSignals(); - signalDispatcher_.blockSignals(); - fileDispatcher_.prepareRun(); - runner_.run(); + 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::FIFORunner::instance().run(); } } +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::EventHookDispatcher* eed (&detail::EventHookDispatcher::instance()); + + eed->~EventHookDispatcher(); + fld->~FileDispatcher(); + sdd->~SignalDispatcher(); + tdd->~TimerDispatcher(); + fdd->~FdDispatcher(); + ffr->~FIFORunner(); + fdm->~FdManager(); + + 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////////////////////////////////////////