运用了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 12716 (GCD == XOR) GCD XOR

    题意: 问整数n以内,有多少对整数a.b满足(1≤b≤a)且gcd(a, b) = xor(a, b) 分析: gcd和xor看起来风马牛不相及的运算,居然有一个比较"神奇"的结论 ...

  2. CodeForces Round #279 (Div.2)

    A: 题意: 有三个项目和n个学生,每个学生都擅长其中一个项目,现在要组成三个人的队伍,其中每个人恰好擅长其中一门,问能组成多少支队伍. 分析: 最多能组成的队伍的个数就是擅长项目里的最少学生. #i ...

  3. Codeforces Round #271 (Div. 2)

    A. Keyboard 题意:一个人打字,可能会左偏一位,可能会右偏一位,给出一串字符,求它本来的串 和紫书的破损的键盘一样 #include<iostream> #include< ...

  4. jfinal框架教程-学习笔记(一)

    JFinal  是基于 Java  语言的极速  WEB  + ORM  开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java 语言所有优势 ...

  5. UVA 10917 Walk Through the Forest(dijkstra+DAG上的dp)

    用新模板阿姨了一天,换成原来的一遍就ac了= = 题意很重要..最关键的一句话是说:若走A->B这条边,必然是d[B]<d[A],d[]数组保存的是各点到终点的最短路. 所以先做dij,由 ...

  6. jQuery避免$符和其他JS库冲突的方法对比

    1.如果jquery库在第三方库之后引用.这个时候jquery库会占用$. 解决办法:剔除$符号的使用权. <script type="text/javascript" sr ...

  7. BOM浏览器对象模型和API速查

    什么是BOMBOM是Browser Object Model的缩写,简称浏览器对象模型BOM提供了独立于内容而与浏览器窗口进行交互的对象由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对象是wi ...

  8. linux面试题3

    1. 下面的网络协议中,面向连接的的协议是: A . A 传输控制协议 B 用户数据报协议 C 网际协议 D 网际控制报文协议 2. 在/etc/fstab文件中指定的文件系统加载参数中, D 参数一 ...

  9. <十>面向对象分析之UML核心元素之关系

    关系        --->在UML中关系是非常重要的语义,它抽象出对象之间的联系,让对象构成特定的结构.        一,关联关系(association)

  10. SpringMVC——实现拦截器

    1. SpringMVC拦截器的概念与Struts2相同 2. 实现拦截器 (1) 项目结构 (2) 实现HandlerInterceptor接口 package com.zhengbin.contr ...