运用了static函数实现文件封装
提升变量访问效率的关键字register,该关键字暗示该变量可能被频繁访问,如果可能,请将值存放在寄存器中
内存集中管理,每个节点在取消后并没有立即释放内存,而是调用cleanup时统一释放
定时器的hash函数是异或结果求余生成key
static unsigned int
hash( Timer* t )
    {
    /* We can hash on the trigger time, even though it can change over
    ** the life of a timer via either the periodic bit or the tmr_reset()
    ** call.  This is because both of those guys call l_resort(), which
    ** recomputes the hash and moves the timer to the appropriate list.
    */
    return (
     (unsigned int) t->time.tv_sec ^
     (unsigned int) t->time.tv_usec ) % HASH_SIZE;
    }
定时器的hash结构
定时器的数据结构是一个链式寻址的hash表,通过定时器的秒和微秒hash出相应的key,再遍历key下的双向链表进行查找、插入、删除。为什么采用链式寻址而不是数组存储的开放定址法,猜测是节点链表是有序链表,遍历/修改元素的效率已经很高,空间占用也会低于开放寻址。
定时器的插入:时间越早的定时器节点位置越靠前,新插入的节点可以追加在最前面、中间、也有可能是最后。
定时器的删除:如果是hashkey对应的首节点,将hash表key的首节点指向下一个节点。
定时器的重新排序:指定的定时器可以进行排序,删除该节点后计算hash值并插入hash表
定时器的初始化:hash表key的首节点重置,free_timers、alloc_count、active_count、free_count重置
定时器的创建:创建一个定时器节点,指定定时器的回调函数和回调函数的参数以及定时器的时间,获得一个初始化完成的定时器指针
定时器的超时:传入一个时间,如果没有供触发的定时器,返回一个NULL指针;如果在时间内有定时器被触发,那么返回一个时间为0的时间指针;如果有定时器,但没有到触发的时间点,返回剩余触发时间的时间指针
查找第一个超时的优化,hash表key下面的超时节点都是从早到晚排序的,因此查找超时只需要判断hash表key下的首节点是否超时,并从所有超时的首节点中找到最小的节点。
定时器的运行:hash表的所有链表都是有序的,因此遍历每个链表查找已经超时的定时器并调用定时器回调函数,链表下找到未触发的定时器就继续搜索下一个链表。如果已经触发的定时器是周期定时器,那么增加一定时间后重新排序该定时器链表;如果已经触发的定时器是非周期定时器,触发后取消该定时器。
定时器的重置:对一个已经存在的定时器节点重新设置定时器时间并调用定时器排序
定时器的取消:调用hash节点的删除方法,将该定时器删除并将激活的定时器数量-1。
定时器的清理:调用取消方法取消的定时器节点清理内存,每个取消的定时器都会从hash表中移除并保存在一个free_timers列队中,但没有当场清理内存,而是在调用清理方法时统一清理,能够提升程序效率。
定时器的销毁:彻底清理定时器队列,遍历hash节点和链表,取消所有的定时器后调用清理方法删除已申请的内存
定时器的状态报告:打印定时器hash的状况,生效的、空闲的、总的定时器数量,如果生效的+空闲的!=总的定时器数量,还会打印一条错误信息。

thttpd的定时器的更多相关文章

  1. thttpd源代码解析 定时器模块

    thttpd源代码解析 定时器模块 thttpd是很轻量级的httpserver,可运行文件仅50kB.名称中的第一个t表示tiny, turbo, 或throttling 与lighttpd.mem ...

  2. 小型web服务器thttpd的学习总结(下)

    1.主函数模块分析 对于主函数而言,概括来说主要做了三点内容,也就是初始化系统,进行系统大循环,退出系统.下面主要简单阐述下在这三个部分,又做了哪些工作呢. 初始化系统 拿出程序的名字(argv[0] ...

  3. 小型web服务器thttpd的学习总结(上)

    1.软件的主要架构 软件的文件布局比较清晰,主要分为6个模块,主模块是thttpd.c文件,这个文件中包含了web server的主要逻辑,并调用了其他模块的函数.其他的5个模块都是单一的功能模块,之 ...

  4. Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用

    OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...

  5. 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)

    转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...

  6. [Java定时器]用Spring Task实现一个简单的定时器.

    今天做一个项目的的时候需要用到定时器功能.具体需求是: 每个月一号触发一次某个类中的方法去拉取别人的接口获取上一个月份车险过期的用户.如若转载请附上原文链接:http://www.cnblogs.co ...

  7. Node+fs+定时器(node-schedule)+MySql

    目标:将本人写博客时候的截图保存到桌面的图片 执行保存到指定文件进行整理 并写入数据库 先看最终的目录结构: package.json文件: { "name": "zqz ...

  8. 深入理解定时器系列第一篇——理解setTimeout和setInterval

    × 目录 [1]setTimeout [2]setInterval [3]运行机制[4]作用[5]应用 前面的话 很长时间以来,定时器一直是javascript动画的核心技术.但是,关于定时器,人们通 ...

  9. 前端开发:setTimeout与setInterval 定时器与异步循环数组

    前端开发:setTimeout与setInterval 定时器与异步循环数组 前言: 开通博客园三个月以来,随笔记录了工作中遇到的大大小小的难题,也看过无数篇令人启发的文章,我觉得这样的环境是极好的, ...

随机推荐

  1. UVa 10375 (唯一分解定理) Choose and divide

    题意: 求组合数C(p, q) / C(r, s)结果保留5为小数. 分析: 先用筛法求出10000以内的质数,然后计算每个素数对应的指数,最后再根据指数计算答案. #include <cstd ...

  2. HDU 3746 (KMP求最小循环节) Cyclic Nacklace

    题意: 给出一个字符串,要求在后面添加最少的字符是的新串是循环的,且至少有两个循环节.输出最少需要添加字符的个数. 分析: 假设所给字符串为p[0...l-1],其长度为l 有这样一个结论: 这个串的 ...

  3. IIS Web负载均衡的几种方式

    Web负载均衡的几种实现方式 摘要:负载均衡(Load Balance)是集群技术(Cluster)的一种应用.负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力.目前最常见的负载均衡应用 ...

  4. 为PHP增加PDO-Mysql驱动

    一.问题 公司有一台老的Linux服务器,Apache+MySQL+Php结构的, 要把最近做的一个PHP项目部署到上面,做为测试环境, 由于新项目是用PHP的YII框架开发的,而YII框架的数据访问 ...

  5. Discuz!NT静态文件缓存(SQUID)

    在目前最新版本的产品中,我们提供了缓存静态文件的解决方案,就是使用SQUID做静态前端,将论坛中的大部分静态文件布署或外链到一个新的HTTP链接上,其中可以外链的静态文件包括:      1.Disc ...

  6. 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)

    [题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...

  7. 新闻类App使用的组件

    UI SlidingMenu:com.jeremyfeinstein.slidingmenu:滑动菜单 ActionBarSherlock:com.actionbarsherlock:Action B ...

  8. 遍历 集合 Dictionary 的时候修改集合 方法

    Dictionary<string, string> dic = new Dictionary<string, string>(); dic.Add("1" ...

  9. C#条件语句、循环语句

    一.程序的三种结构 顺序结构 分支结构 循环结构 二.条件语句if 语句是最有用的控制结构之一. if … else …语句的语法: if (布尔表达式)执行操作的语句  或if (布尔表达式)执行操 ...

  10. python easy_install centos 下安装过程和原理解析

    一.easy_install 安装过程 其安装过程有很多种,我也找了很多的例子,但是结果都不太好,以下方法的结果是不错的. easy_install与yum类似,使用easy_install,可以轻松 ...