运用了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. 缺少编译器要求的成员“System.Runtime.CompilerServices.ExtensionAttribute..ctor” 解决方案

    我自己使用的解决方法 错误产生环境及非完美解决办法 错误提示:缺少编译器要求的成员"System.Runtime.CompilerServices.ExtensionAttribute..c ...

  2. 最简单的视音频播放示例9:SDL2播放PCM

    本文记录SDL播放音频的技术.在这里使用的版本是SDL2.实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API.在Windows平台下,SDL封装了Direct3D这类的API ...

  3. Oracle Analyze 命令 详解

    官网的链接如下: http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_4005.htm#SQLRF01105 使用DBMS ...

  4. 【Ajax】实现注册页面判断用户名是否可用的提示—异步加载

    效果如图 在注册或登录网站时,当我们输入错误格式的账号或信息时,会看到这种提示. 那怎么实现呢,通过ajax异步加载的方式,可以实现不刷新页面就显示出该提示. 实现 首先创建一个JSP,写一个简单的页 ...

  5. MOSS 2010:Visual Studio 2010开发体验(14)——列表开发之事件接收器

    转:http://boke.25k5.com/kan141919.html 通过前面几篇,我们已经完成了内容类型,列表定义,列表实例g 8h"@的开发.本篇继续讲解列表中的一个重要环节- ...

  6. 云计算服务模型,第 3 部分: 软件即服务(PaaS)

    英文原文:Cloud computing service models, Part 3: Software as a Service 软件即服务 (SaaS) 为商用软件提供基于网络的访问.您有可能已 ...

  7. memcache分布式部署的原理分析

    下面本文章来给各位同学介绍memcache分布式部署的原理分析,希望此文章对你理解memcache分布式部署会有所帮助哦.   今天在封装memcache操作类库过程中,意识到一直以来对memcach ...

  8. Storm的本地运行模式示例

    以word count为例,本地化运行模式(不需要安装zookeeper.storm集群),maven工程, pom.xml文件如下: <project xmlns="http://m ...

  9. Android 的实现TextView中文字链接的4种方法

    Android 的实现TextView中文字链接的方式有很多种. 总结起来大概有4种: 1.当文字中出现URL.E-mail.电话号码等的时候,可以将TextView的android:autoLink ...

  10. 对delegate进行扩展 打造通用的"计时完成"方法 z

    让用户尽量少打字 每次让用户输入这么多信息的确很糟糕, 可以改进一下设计: 服务器IP和用户名可以存放在配置文件里面, 初始化的时候默认加载到相应的文本框中; 从安全角度考虑, 密码必须经过用户手动输 ...