06.webserver源码阅读--timer
00.webserver源码阅读--buffer - DavidJIAN - 博客园 (cnblogs.com)
01.webserver源码阅读--BlockQueue - DavidJIAN - 博客园 (cnblogs.com)
02.webserver源码阅读--log - DavidJIAN - 博客园 (cnblogs.com)
03.webserver源码阅读--threadPool - DavidJIAN - 博客园 (cnblogs.com)
04.webserver源码阅读--sqlConnPool - DavidJIAN - 博客园 (cnblogs.com)
05.webserver源码阅读--sqlConnRAII - DavidJIAN - 博客园 (cnblogs.com)
timerNode
计时器堆节点。
类型定义
typedef std::function<void()> timeoutCallBack;
typedef std::chrono::high_resolution_clock Clock;
typedef std::chrono::milliseconds MS;
typedef Clock::time_point TimeStamp;
C++11 std::chrono库详解 - mjwk - 博客园 (cnblogs.com)
成员变量
- id
- 节点id
- expires
- 超时时间,时间戳,绝对时间
- cb
- 超时后的调用对象
成员函数
- 重载操作符 < 。根据expires来比较。
timer
计时器堆类。最小堆,根据节点的超时时间(expires)来调整堆节点。每个一段时间就检查堆顶节点的expires是否小于当前时间,若是,则调用对应的callback,并删除节点;否则,什么都不做。
成员变量
- vector< timerNode> heap
- vector模仿堆,应该用priority_queue来实现
- unordered_map<int, size_t> ref
- 主要是堆节点id到节点在数组下标的映射
成员函数
- 构造函数
- 堆大小为64
- 析构函数
- 调用clear函数
- adjust
- 调整堆节点的expires
- add
- 添加堆节点。若id已存在,则修改节点的expires,否则直接插入堆节点
- do_work
- 根据id获取节点在堆数组的位置i
- 调用node_i的cb
- 删除该堆节点
- clear
- 调用两个成员变量的clear函数
- tick
- 检查堆顶节点expires是否大于当前时间,若是,调用其对应的cb,并出堆
- pop
- 将堆顶节点删除
- get_next_tick
- 先调用tick
- 返回下一tick距今的时间
- del
- 删除数组中第i个计时器
- siftup、siftdown
- 堆调整函数
- swap_node
- 交换堆中的两个节点

浙公网安备 33010602011771号