Scheduler/Console: Fix bit-number-lookup-magic to work under 64bit
[senf.git] / Scheduler / Scheduler.cc
index 02364a4..7d86523 100644 (file)
 #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////////////////////////////////////////