-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtimer.h
67 lines (54 loc) · 1.65 KB
/
timer.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
// encode UTF-8
// @Author : Aged_cat
// @Date : 2021-05-04
#ifndef TIMER_H
#define TIMER_H
#include<queue>
#include<deque>
#include<unordered_map>
#include<ctime>
#include<chrono>
#include<functional>
#include<memory>
#include "HTTPconnection.h"
typedef std::function<void()> TimeoutCallBack;
typedef std::chrono::high_resolution_clock Clock;
typedef std::chrono::milliseconds MS;
typedef Clock::time_point TimeStamp;
//typedef std::unique_ptr<HTTPconnection> HTTPconnection_Ptr;
class TimerNode{
public:
int id; //用来标记定时器
TimeStamp expire; //设置过期时间
TimeoutCallBack cb; //设置一个回调函数用来方便删除定时器时将对应的HTTP连接关闭
//需要的功能可以自己设定
bool operator<(const TimerNode& t)
{
return expire<t.expire;
}
};
class TimerManager{
typedef std::shared_ptr<TimerNode> SP_TimerNode;
public:
TimerManager() {heap_.reserve(64);}
~TimerManager() {clear();}
//设置定时器
void addTimer(int id,int timeout,const TimeoutCallBack& cb);
//处理过期的定时器
void handle_expired_event();
//下一次处理过期定时器的时间
int getNextHandle();
void update(int id,int timeout);
//删除制定id节点,并且用指针触发处理函数
void work(int id);
void pop();
void clear();
private:
void del_(size_t i);
void siftup_(size_t i);
bool siftdown_(size_t index,size_t n);
void swapNode_(size_t i,size_t j);
std::vector<TimerNode>heap_;
std::unordered_map<int,size_t>ref_;//映射一个fd对应的定时器在heap_中的位置
};
#endif //TIMER_H