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)

Chrono in C++ - GeeksforGeeks

成员变量

  • 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
    • 交换堆中的两个节点
posted @ 2023-01-08 16:31  DavidJIAN  阅读(18)  评论(0)    收藏  举报