X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FScheduler.cc;h=09971a84e29de57b8df910c748a80316cbeb6bea;hb=739eecfbeffc911e700660864ff1d7f05c6283d0;hp=5285fa7da8b2e77fd443843830e7b23d8619b80a;hpb=3d16600678b948ff3bd0e4fd2a1a800fcc629a03;p=senf.git diff --git a/Scheduler/Scheduler.cc b/Scheduler/Scheduler.cc index 5285fa7..09971a8 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; @@ -156,38 +156,56 @@ prefix_ void senf::Scheduler::process() terminate_ = false; eventTime_ = ClockService::now(); while (! terminate_) { - while ( ! timerQueue_.empty() && timerQueue_.top()->second.timeout <= eventTime_ ) { + + // 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) - i->second.cb(); + break; timerMap_.erase(i); timerQueue_.pop(); } - if (terminate_) - return; - - int timeout (MinTimeout); - if (! timerQueue_.empty()) { + int timeout (-1); + if (timerQueue_.empty()) { + if (fdTable_.empty()) + break; + } + else { ClockService::clock_type delta ( (timerQueue_.top()->second.timeout - eventTime_)/1000000UL); - if (deltasecond.canceled) + ; + else if (i->second.timeout <= eventTime_) + i->second.cb(); + else + break; + timerQueue_.pop(); + timerMap_.erase(i); + } + + if (events <= 0) continue; FdTable::iterator i = fdTable_.find(ev.data.fd);