-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTimerQueue.h
96 lines (80 loc) · 2.28 KB
/
TimerQueue.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#ifndef TIMERQUEUE_H
#define TIMERQUEUE_H
#include "Declear.h"
#include "Timestamp.h"
#include "IFChannelCallBack.h"
#include "IFRun.h"
#include <vector>
#include <set>
class TimerQueue : public IFChannelCallBack
{
public:
class Timer
{
public:
Timer(Timestamp _time, IFRun *_pRun, double _interval):
time(_time),
id(_time),
pRun(_pRun),
interval(interval)
{}
Timestamp getTimestamp(){return time;}
void run() { pRun->run(this); }
bool isRepeat() {return interval > 0.0;}
Timestamp getId() {return id;}
void moveToNext() {time = Timestamp::nowAfter(interval);}
private:
Timestamp time;
Timestamp id;
IFRun *pRun;
double interval;
};
class AddTimerWrapper : public IFRun
{
public:
AddTimerWrapper(TimerQueue *_pTimerQueue):pTimerQueue(_pTimerQueue)
{}
virtual void run(void *param)
{
pTimerQueue->doAddTimer(param);
}
private:
TimerQueue *pTimerQueue;
};
class CancelTimerWrapper : public IFRun
{
public:
CancelTimerWrapper(TimerQueue *_pTimerQueue):pTimerQueue(_pTimerQueue)
{}
virtual void run(void *param)
{
pTimerQueue->doCancelTimer(param);
}
private:
TimerQueue *pTimerQueue;
};
TimerQueue(EventLoop *_pEventLoop);
long addTimer(IFRun *pRun, Timestamp time, double interval);
void cancelTimer(long timerId);
virtual void handleRead();
virtual void handleWrite();
private:
typedef std::pair<Timestamp, Timer*> Entry;
typedef std::set<Entry> TimerList;
EventLoop *pEventLoop;
int timerfd;
Channel *pChannle;
AddTimerWrapper *pAddTimerWrapper;
CancelTimerWrapper *pCancelTimerWrapper;
TimerList timerlist;
int createTimerfd();
bool insert(Timer *pTimer);
void resetTimerfd(int timerfd, Timestamp time);
struct timespec howMuchTimeFromNow(Timestamp when);
void doAddTimer(void *param);
void doCancelTimer(void *param);
void readTimerfd(int timerfd, Timestamp now);
std::vector<Entry> getExpired(Timestamp now);
void reset(const vector<Entry> &expired, Timestamp now);
};
#endif