X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FScheduler.cc;h=5285fa7da8b2e77fd443843830e7b23d8619b80a;hb=51eecff12414ff9a0e99b398c1befb5aa438fd71;hp=e4bc1a09fbc42d59e55994089e0094e67e8c28dc;hpb=8421c3a8da7485cb8781045494ecaab3ed84f403;p=senf.git diff --git a/Scheduler/Scheduler.cc b/Scheduler/Scheduler.cc index e4bc1a0..5285fa7 100644 --- a/Scheduler/Scheduler.cc +++ b/Scheduler/Scheduler.cc @@ -79,26 +79,15 @@ #include #include #include "Utils/Exception.hh" -#include "Utils/MicroTime.hh" static const int EPollInitialSize = 16; #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// -prefix_ senf::Scheduler::Scheduler & senf::Scheduler::instance() -{ - static Scheduler instance; - return instance; -} - -prefix_ void senf::Scheduler::timeout(unsigned long timeout, TimerCallback const & cb) -{ - timerQueue_.push(TimerSpec(now()+1000*timeout,cb)); -} - prefix_ senf::Scheduler::Scheduler() - : epollFd_(epoll_create(EPollInitialSize)) + : timerIdCounter_(0), epollFd_ (epoll_create(EPollInitialSize)), terminate_(false), + eventTime_(0) { if (epollFd_<0) throw SystemException(errno); @@ -165,30 +154,44 @@ prefix_ int senf::Scheduler::EventSpec::epollMask() prefix_ void senf::Scheduler::process() { terminate_ = false; + eventTime_ = ClockService::now(); while (! terminate_) { - - MicroTime timeNow = now(); - while ( ! timerQueue_.empty() && timerQueue_.top().timeout <= timeNow ) { - timerQueue_.top().cb(); + while ( ! timerQueue_.empty() && timerQueue_.top()->second.timeout <= eventTime_ ) { + TimerMap::iterator i (timerQueue_.top()); + if (! i->second.canceled) + i->second.cb(); + timerMap_.erase(i); timerQueue_.pop(); } + if (terminate_) return; - int timeout = timerQueue_.empty() ? -1 : int((timerQueue_.top().timeout - timeNow)/1000); + + int timeout (MinTimeout); + if (! timerQueue_.empty()) { + ClockService::clock_type delta ( + (timerQueue_.top()->second.timeout - eventTime_)/1000000UL); + if (deltasecond); unsigned extraFlags (0); @@ -232,4 +235,6 @@ prefix_ void senf::Scheduler::process() // c-file-style: "senf" // indent-tabs-mode: nil // ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// comment-column: 40 // End: