X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FScheduler.cc;h=adbb6a6b5f0fe5d3101084f4ee4f081973a23acb;hb=82ad2ed94c12c3e53097fef92978de8c28239fab;hp=35155e35dfe1ea062f4ec26ba2b20b8e39b25ada;hpb=e8b91aa6a817af6d9a3714e7b66be6c0d6b0a4e5;p=senf.git diff --git a/Scheduler/Scheduler.cc b/Scheduler/Scheduler.cc index 35155e3..adbb6a6 100644 --- a/Scheduler/Scheduler.cc +++ b/Scheduler/Scheduler.cc @@ -78,7 +78,7 @@ // Custom includes #include #include -#include "Utils/Exception.hh" +#include "../Utils/Exception.hh" static const int EPollInitialSize = 16; @@ -157,6 +157,9 @@ prefix_ void senf::Scheduler::process() eventTime_ = ClockService::now(); while (! terminate_) { + // Since a callback may have disabled further timers, we need to check for canceled timeouts + // again. + while (! timerQueue_.empty()) { TimerMap::iterator i (timerQueue_.top()); if (! i->second.canceled) @@ -187,7 +190,8 @@ prefix_ void senf::Scheduler::process() // We always run event handlers. This is important, even if a file-descriptor is signaled // since some descriptors (e.g. real files) will *always* be ready and we still may want to - // handle timers + // handle timers. + // Time handlers are run before file events to not delay them unnecessarily. while (! timerQueue_.empty()) { TimerMap::iterator i (timerQueue_.top()); @@ -197,8 +201,8 @@ prefix_ void senf::Scheduler::process() i->second.cb(); else break; - timerMap_.erase(i); timerQueue_.pop(); + timerMap_.erase(i); } if (events <= 0) @@ -239,6 +243,15 @@ prefix_ void senf::Scheduler::process() } } +/////////////////////////////////////////////////////////////////////////// +// senf::SchedulerLogTimeSource + +prefix_ boost::posix_time::ptime senf::SchedulerLogTimeSource::operator()() + const +{ + return ClockService::abstime(Scheduler::instance().eventTime()); +} + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_