Thttpd服务器对于请求处理,请求响应和CGI子程序的运行时间是有限制的,这里面限制是由Timer.c文件中的函数完成的。计时器的结构为:
typedef struct TimerStruct {
TimerProc* timer_proc;
ClientData client_data;
long msecs;
int periodic;
struct timeval time;
struct TimerStruct* prev;
struct TimerStruct* next;
int hash;
} Timer;
由此可知此结构为一个双向链表结构。
timer_proc为延时处理函数。
client_data为函数的参数。
msecs:为延时处理时间单位为毫秒。
periodic:为计时器重加载表示
time:为此时间处理函数执行的时间。
prev:为此计时器的前向指针。
next:为此计时器的后向指针
hash:为计算的此计时器的hash值。
下面将介绍这个文件中的函数。
static unsigned int hash( Timer* t )
hash函数是根据传入的Timer型数据的秒数和毫秒数的异或计算在去计时器数组数的余,得到这个时间再计时器数组中的位置。
static void l_add( Timer* t )
l_add是将创建的计时器处理函数添加在计时器处理链表中,如果计算在hash值的表项的值为空表示此表项为空设置t为此表项的头结点,对于此表项不为空(hash表存在冲突)根据执行时间的先后顺序排序在此表项中的位置。
static void l_remove( Timer* t )
l_remove函数为移除此计时器处理函数。
static void l_resort( Timer* t )
l_resort函数为重新再添加一次此计时器处理函数
void tmr_init( void )
tmr_init函数初始化计时器对象,设置计时器数组中的所有元素的值都为0且分配的计时器,活跃状态的计时器空闲状态的计时器的值也为0.
Timer* tmr_create(
struct timeval* nowP, TimerProc* timer_proc, ClientData client_data,
long msecs, int periodic )
tmr_create函数为创建计时器处理函数,nowP为当前的时间,timer_proc为处理函数,client_data为函数的参数,msecs为延迟执行时间,periodic为计时器重加载标志。tmr_create函数首先将会判断free_timers(当前可分配的计时器)是否为空为空表示此对象没有分配空间将会为其分配空间,对于分配空间的设置free_timers(当前可分配的计时器)指向此计时器的一个计时器单元,设置计时器的处理函数,函数参数和优先级,根据传入的时间值设置计时器处理函数的执行时间。并将此计时器处理函数添加至处理链表中,最终返回此计时器对象。
struct timeval* tmr_timeout( struct timeval* nowP )
tmr_timeout函数以timeval对象的返回计时器处理函数的超时时间值。
long tmr_mstimeout( struct timeval* nowP )
tmr_mstimeout函数用于计算计时器hash表中是否有计时器的到了需要执行的时间。返回-1表示hash表为空即没有计时器处理函数,为0表示所有的计时器未到达计时时间,为正值表示有计时器到达了处理时间即返回的是第一个到达计时器处理函数处理时间的超时值,单位为毫秒。
void tmr_run( struct timeval* nowP )
遍历每一个可以执行的计时器处理函数,当到达执行时间将会调用执行函数进行程序执行,对于periodic重加载标志为为真值的计时器处理函数进行重新加载,反之则从计时器处理函数链表中删除此计时器。
void tmr_reset( struct timeval* nowP, Timer* t )
tmr_reset函数用于重新设置此计时器处理函数的执行时间,并在计时器处理函数链表中重新添加此计时器。
void tmr_cancel( Timer* t )
tmr_cancel函数用于设置此计时器从计时器函数处理链表中删除此计时器,并释放此计时器的空间。
void tmr_cleanup( void )
tmr_cleanup清除当前处理的计时器处理函数后面的计时器处理函数的资源
void tmr_term( void )
tmr_term清除所有计时器请求的资源
void tmr_logstats( long secs )
tmr_logstats函数用于打印计时器的状态信息,分配的计时器的数量,有多少处于活跃状态,有多少处于空闲状态。