X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Scheduler%2FScheduler.cc;h=5285fa7da8b2e77fd443843830e7b23d8619b80a;hb=51eecff12414ff9a0e99b398c1befb5aa438fd71;hp=799c4a5806a7ec26c28278cf269d1c2772efcdc6;hpb=914af680a37d303da51e3877972ca9bd68d6190b;p=senf.git diff --git a/Scheduler/Scheduler.cc b/Scheduler/Scheduler.cc index 799c4a5..5285fa7 100644 --- a/Scheduler/Scheduler.cc +++ b/Scheduler/Scheduler.cc @@ -85,20 +85,9 @@ 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(sched_time timeout, TimerCallback const & cb) -{ - timerQueue_.push(TimerSpec(now()+timeout,cb)); -} - prefix_ senf::Scheduler::Scheduler() - : epollFd_ (epoll_create(EPollInitialSize)), - epoch_ (boost::posix_time::microsec_clock::universal_time()) + : timerIdCounter_(0), epollFd_ (epoll_create(EPollInitialSize)), terminate_(false), + eventTime_(0) { if (epollFd_<0) throw SystemException(errno); @@ -165,11 +154,13 @@ prefix_ int senf::Scheduler::EventSpec::epollMask() prefix_ void senf::Scheduler::process() { terminate_ = false; + eventTime_ = ClockService::now(); while (! terminate_) { - sched_time 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(); } @@ -178,7 +169,8 @@ prefix_ void senf::Scheduler::process() int timeout (MinTimeout); if (! timerQueue_.empty()) { - sched_time delta ((timerQueue_.top().timeout - timeNow)/1000000UL); + ClockService::clock_type delta ( + (timerQueue_.top()->second.timeout - eventTime_)/1000000UL); if (delta