1 // -*- mode: C++; indent-tabs-mode: nil; -*-
2 #ifndef _BLACKBOX_Timer_hh
3 #define _BLACKBOX_Timer_hh
6 #ifdef TIME_WITH_SYS_TIME
9 #else // !TIME_WITH_SYS_TIME
10 # ifdef HAVE_SYS_TIME_H
11 # include <sys/time.h>
12 # else // !HAVE_SYS_TIME_H
14 # endif // HAVE_SYS_TIME_H
15 #endif // TIME_WITH_SYS_TIME
18 // forward declaration
19 class TimerQueueManager;
21 class TimeoutHandler {
23 virtual void timeout(void) = 0;
28 TimerQueueManager *manager;
29 TimeoutHandler *handler;
32 timeval _start, _timeout;
34 BTimer(const BTimer&);
35 BTimer& operator=(const BTimer&);
38 BTimer(TimerQueueManager *m, TimeoutHandler *h);
39 virtual ~BTimer(void);
41 void fireTimeout(void);
43 inline bool isTiming(void) const { return timing; }
44 inline bool isRecurring(void) const { return recur; }
46 inline const timeval &getTimeout(void) const { return _timeout; }
47 inline const timeval &getStartTime(void) const { return _start; }
49 timeval timeRemaining(const timeval &tm) const;
50 bool shouldFire(const timeval &tm) const;
51 timeval endpoint(void) const;
53 inline void recurring(bool b) { recur = b; }
55 void setTimeout(long t);
56 void setTimeout(const timeval &t);
58 void start(void); // manager acquires timer
59 void stop(void); // manager releases timer
60 void halt(void); // halts the timer
62 bool operator<(const BTimer& other) const
63 { return shouldFire(other.endpoint()); }
70 template <class _Tp, class _Sequence, class _Compare>
71 class _timer_queue: protected std::priority_queue<_Tp, _Sequence, _Compare> {
73 typedef std::priority_queue<_Tp, _Sequence, _Compare> _Base;
75 _timer_queue(void): _Base() {}
76 ~_timer_queue(void) {}
78 void release(const _Tp& value) {
79 c.erase(std::remove(c.begin(), c.end(), value), c.end());
80 // after removing the item we need to make the heap again
81 std::make_heap(c.begin(), c.end(), comp);
83 bool empty(void) const { return _Base::empty(); }
84 size_t size(void) const { return _Base::size(); }
85 void push(const _Tp& value) { _Base::push(value); }
86 void pop(void) { _Base::pop(); }
87 const _Tp& top(void) const { return _Base::top(); }
90 _timer_queue(const _timer_queue&) {}
91 _timer_queue& operator=(const _timer_queue&) {}
94 struct TimerLessThan {
95 bool operator()(const BTimer* const l, const BTimer* const r) const {
101 typedef _timer_queue<BTimer*, std::vector<BTimer*>, TimerLessThan> TimerQueue;
103 class TimerQueueManager {
105 virtual void addTimer(BTimer* timer) = 0;
106 virtual void removeTimer(BTimer* timer) = 0;
109 #endif // _BLACKBOX_Timer_hh