1、Timestamp
class Timestamp : public muduo::copyable, public boost::less_than_comparable<Timestamp> { public: /// Constucts an invalid Timestamp. Timestamp() : microSecondsSinceEpoch_(0) { } explicit Timestamp(int64_t microSecondsSinceEpochArg) : microSecondsSinceEpoch_(microSecondsSinceEpochArg) { } /// Get time of now. static Timestamp now() { struct timeval tv; gettimeofday(&tv, NULL);//获得当前精确时间(1970年1月1日到现在的时间) int64_t seconds = tv.tv_sec; return Timestamp(seconds * kMicroSecondsPerSecond + tv.tv_usec);//seconds*1000000+usec } static Timestamp fromUnixTime(time_t t) { return fromUnixTime(t, 0); } static Timestamp fromUnixTime(time_t t, int microseconds) { return Timestamp(static_cast<int64_t>(t) * kMicroSecondsPerSecond + microseconds); } static const int kMicroSecondsPerSecond = 1000 * 1000;//1s=1000ms=1000*1000us private: int64_t microSecondsSinceEpoch_;//是现在这个时刻距离1970-01-01 00:00:00 的微秒数 };
class Timer : boost::noncopyable { public: Timer(const TimerCallback& cb, Timestamp when, double interval) : callback_(cb), expiration_(when), interval_(interval), repeat_(interval > 0.0), sequence_(s_numCreated_.incrementAndGet()) { } void run() const { callback_(); } Timestamp expiration() const { return expiration_; } bool repeat() const { return repeat_; } int64_t sequence() const { return sequence_; } void restart(Timestamp now); static int64_t numCreated() { return s_numCreated_.get(); } private: const TimerCallback callback_;//超时回调函数 Timestamp expiration_;//下一次超时时间 const double interval_;//超时时间间隔,若为一次性定时器,则为0.0 const bool repeat_;//是否重复 const int64_t sequence_;//定时器序号 static AtomicInt64 s_numCreated_;// 定时器计数,当前已经创建的定时器数量 };
3、TimerID
class TimerId : public muduo::copyable { public: TimerId() : timer_(NULL), sequence_(0) { } TimerId(Timer* timer, int64_t seq) : timer_(timer), sequence_(seq) { } // default copy-ctor, dtor and assignment are okay friend class TimerQueue; private: Timer* timer_; int64_t sequence_; };
class TimerQueue : boost::noncopyable { public: TimerQueue(EventLoop* loop); ~TimerQueue(); /// Schedules the callback to be run at given time, /// repeats if @c interval > 0.0. /// /// Must be thread safe. Usually be called from other threads. TimerId addTimer(const TimerCallback& cb, Timestamp when, double interval); void cancel(TimerId timerId); private: // FIXME: use unique_ptr<Timer> instead of raw pointers. typedef std::pair<Timestamp, Timer*> Entry; typedef std::set<Entry> TimerList; typedef std::pair<Timer*, int64_t> ActiveTimer; typedef std::set<ActiveTimer> ActiveTimerSet; void addTimerInLoop(Timer* timer); void cancelInLoop(TimerId timerId); // called when timerfd alarms void handleRead(); // move out all expired timers std::vector<Entry> getExpired(Timestamp now); void reset(const std::vector<Entry>& expired, Timestamp now); bool insert(Timer* timer); EventLoop* loop_; const int timerfd_; Channel timerfdChannel_; // Timer list sorted by expiration TimerList timers_; // for cancel() ActiveTimerSet activeTimers_; bool callingExpiredTimers_; /* atomic */ ActiveTimerSet cancelingTimers_; };