运用了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. 解析UML9种图的作用

    本文和大家重点讨论一下UML9种图的概念,UML中有五类图,共有9种图形,每种图形都有各自的特点,下面就让我们一起来看一下这些图形特点的详细介绍吧. UML9种图简介 1.用例图 说明的是谁要使用系统 ...

  2. [020] Android模拟器访问本地Web应用

    本篇文章试图解决这样一个问题:如何在Android模拟器上访问本地的Web应用? 例如,在你的开发机器上启动一个Tomcat服务,接着打开电脑上的浏览器,默认情况下输入http://localhost ...

  3. EF 更新指定的字段

    假如你有个表,有30个字段,你只想更新其中的1到2个字段的话,就可以用得上这篇文章 作用:类似于我们以前的sql代码 update xxx表 set name='ok',pwd='ok' where ...

  4. HDU 2433 Travel (最短路,BFS,变形)

    题意: 给出一个图的所有边,每次从图中删除一条边,求任意点对的路径总和(求完了就将边给补回去).(有重边) 思路: #include <bits/stdc++.h> using names ...

  5. 【转】android:layout_gravity和android:gravity的区别

    1.首先来看看android:layout_gravity和android:gravity的使用区别. android:gravity: 这个是针对控件里的元素来说的,用来控制元素在该控件里的显示位置 ...

  6. 怎样查看Eclipse是32位还是64位

    首先进入到Eclipse的安装目录,如下图:   查找到文件名为"eclipse.ini" 文件,使用文本编辑工具,或记事本打开,如下图: 如图中的红框所示,如果是win32.x8 ...

  7. js基础学习第一天(关于DOM和BOM)一

    关于BOM和DOM BOM 下面一幅图很好的说明了BOM和DOM的关系 BOM提供了一些访问窗口对象的一些方法,我们可以用它来移动窗口位置,改变窗口大小,打开新窗口和关闭窗口,弹出对话框,进行导航以及 ...

  8. Top Android App使用的组件 2

    微信_355 SQLCipher:info.guardianproject.database:Android数据库加密 微博_650 点信传媒:cn.dx:广告平台 Apache HttpClient ...

  9. Devexpress GridControl z

    http://minmin86121.blog.163.com/blog/static/4968115720144194923578/ 1 AllowNullInput=False; --Devexp ...

  10. 细雨学习笔记:Jmeter测试计划最基本的元素

    测试计划-用户组下最基本的元素: 1)HTTP请求默认值 2)HTTP Cookie 管理器(有些操作需要登录后才能访问,用户信息记录在Cookie中,各请求之间就可以共享Cookie了) 3)请求S ...