2 #include <msp/core/raii.h>
18 for(vector<SlotProxy>::iterator i=slots.begin(); i!=slots.end(); ++i)
22 Timer::Slot &Timer::add(const TimeDelta &td)
24 Slot *s = new Slot(td);
27 push_heap(slots.begin(), slots.end());
33 Timer::Slot &Timer::add(const TimeStamp &ts)
35 Slot *s = new Slot(ts);
38 push_heap(slots.begin(), slots.end());
44 void Timer::cancel(Slot &slot)
47 for(vector<SlotProxy>::iterator i=slots.begin(); i!=slots.end(); ++i)
52 make_heap(slots.begin(), slots.end());
62 void Timer::tick(const TimeDelta &timeout)
65 throw invalid_argument("Timer::tick");
70 void Timer::do_tick(const TimeDelta &timeout)
74 deadline = now()+timeout;
85 next = slots.begin()->slot;
86 stamp = next->get_timeout();
91 if(timeout && (!deadline || t<deadline))
93 SetFlag setf(blocking);
95 if(stamp && (!deadline || stamp<deadline))
102 // The slots may have changed while waiting so check again
109 pop_heap(slots.begin(), slots.end());
115 if(next->signal_timeout.emit() && next->increment())
118 slots.push_back(next);
119 push_heap(slots.begin(), slots.end());
131 TimeStamp Timer::get_next_timeout() const
135 return slots.begin()->slot->get_timeout();
139 Timer::Slot::Slot(const TimeDelta &td):
141 timeout(now()+interval)
144 Timer::Slot::Slot(const TimeStamp &ts):
148 bool Timer::Slot::increment()
157 Timer::SlotProxy::SlotProxy(Slot *s):
161 bool Timer::SlotProxy::operator<(const SlotProxy &sp) const
163 return slot->get_timeout()>sp.slot->get_timeout();