1 // excerpts from http://code.google.com/p/muduo/ 2 // 3 // Use of this source code is governed by a BSD-style license 4 // that can be found in the License file. 5 // 6 // Author: Shuo Chen (chenshuo at chenshuo dot com) 7 8 #ifndef MUDUO_NET_TIMERQUEUE_H 9 #define MUDUO_NET_TIMERQUEUE_H 10 11 #include <set> 12 #include <vector> 13 14 #include <boost/noncopyable.hpp> 15 16 #include "datetime/Timestamp.h" 17 #include "thread/Mutex.h" 18 #include "Callbacks.h" 19 #include "Channel.h" 20 21 namespace muduo 22 { 23 24 class EventLoop; 25 class Timer; 26 class TimerId; 27 28 /// 29 /// A best efforts timer queue. 30 /// No guarantee that the callback will be on time. 31 /// 32 class TimerQueue : boost::noncopyable 33 { 34 public: 35 TimerQueue(EventLoop* loop); 36 ~TimerQueue(); 37 38 /// 39 /// Schedules the callback to be run at given time, 40 /// repeats if @c interval > 0.0. 41 /// 42 /// Must be thread safe. Usually be called from other threads. 43 TimerId addTimer(const TimerCallback& cb, 44 Timestamp when, 45 double interval); 46 47 // void cancel(TimerId timerId); 48 49 private: 50 51 // FIXME: use unique_ptr<Timer> instead of raw pointers. 52 typedef std::pair<Timestamp, Timer*> Entry; 53 typedef std::set<Entry> TimerList; 54 55+ void addTimerInLoop(Timer* timer); 56 // called when timerfd alarms 57 void handleRead(); 58 // move out all expired timers 59 std::vector<Entry> getExpired(Timestamp now); 60 void reset(const std::vector<Entry>& expired, Timestamp now); 61 62 bool insert(Timer* timer); 63 64 EventLoop* loop_; 65 const int timerfd_; 66 Channel timerfdChannel_; 67 // Timer list sorted by expiration 68 TimerList timers_; 69 }; 70 71 } 72 #endif // MUDUO_NET_TIMERQUEUE_H 73