linux C 基于链表链的定时器发布时间:2022/5/31 13:16:54
源码如下:
util_timer.h
#ifndef LST_TIMER
#define LST_TIMER
#include
#include
#include
#include
#define BUFFER_SIZE 64
struct util_timer;
/*
struct client_data{
sockaddr_in address;
int sockfd;
char buf[BUFFER_SIZE];
util_timer * timer;
};
*/
struct util_timer{
time_t expire;
//
client_data * user_data;
char *buffer;
struct util_timer *prev;
struct util_timer *next;
};
struct timer_lst{
struct util_timer * head;
struct util_timer * tail;
};
void cb_func(unsigned char *userdata);
void add_timer2(struct util_timer * timer, struct util_timer *lst_head);
void add_timer(struct util_timer *timer);
void adjust_timer(struct util_timer *timer);
void del_timer(struct util_timer * timer);
void tick();
#endif
util_timer.c
#include "util_timer.h"
struct util_timer * head;
struct util_timer * tail;
void print_hex_ex(unsigned char *buf, int len)
{
int i, n;
printf(" 0 1 2 3 4 5 6 7 8 9 A B C D E F");
n = 0;
for (i=0; iprintf("\nlens:%d\n\n",len);
}
void cb_func(unsigned char *userdata){
print_hex_ex(userdata, 8);
return;
}
void add_timer2(struct util_timer * timer, struct util_timer * lst_head){
struct util_timer * prev = lst_head;
struct util_timer * tmp = prev->next;
while(tmp){
if(timer->expire expire ){
prev->next = timer;
timer->next =tmp;
tmp->prev = timer;
timer->prev = prev;
break;
}
prev = tmp;
tmp = tmp->next;
}
if(!tmp){
prev->next = timer;
timer->prev = prev;
timer->next = NULL;
tail = timer;
}
}
void add_timer(struct util_timer *timer){
if(!timer){
return;
}
if(!head){
head = tail = timer;
return ;
}
if(timer->expire expire){
timer->next = head;
head->prev = timer;
head = timer;
return;
}
add_timer2(timer, head);
}
void adjust_timer(struct util_timer *timer){
if(!timer){
return;
}
struct util_timer * tmp = timer->next;
if(!tmp || (timer->expire expire)){
return;
}
if(timer == head){
head = head->next;
head->prev = NULL;
timer->next = NULL;
add_timer2(timer, head);
}else{
timer->prev->next = timer->next;
timer->next->prev = timer->prev;
add_timer2(timer, timer->next);
}
}
void del_timer(struct util_timer * timer){
if(!timer){
return;
}
if((timer == head) && (timer == tail)){
free(timer);
head = NULL;
tail = NULL;
return;
}
if(timer == head){
head = head->next;
head->prev = NULL;
free(timer);
return;
}
if(timer == tail){
tail = tail ->prev;
tail->next = NULL;
free(timer);
return;
}
timer->prev->next = timer->next;
timer->next->prev = timer->prev;
free(timer);
}
void tick(){
if( !head )
{
return;
}
printf( "timer tick\n" );
time_t cur = time( NULL );
struct util_timer* tmp = head;
while( tmp )
{
if( cur expire )
{
printf("tmp->expire is not chaoshi\n");
break;
}
cb_func( tmp->buffer );
head = tmp->next;
if( head )
{
head->prev = NULL;
}
free(tmp);
tmp = head;
}
}
int main(){
int i;
char *tmpbuf[5]={"aaaaaaaa","bbbbbbbb","cccccccc","dddddddd","eeeeeeee"};
head = NULL;
tail = NULL;
time_t cur = time(NULL);
for(i = 0; i
struct util_timer *timer = NULL ;
timer = (struct util_timer *)malloc(sizeof(struct util_timer)*1);
cur = cur + 1;
timer->expire = cur;
timer->buffer = tmpbuf;
add_timer(timer);
}
printf("sleep begin \n");
sleep(3);
printf("sleep end \n");
tick();
}
编译gcc -o util_timer util_timer.c
运行./util_timer
输出:
[root@hsm timer_test]# ./util_timer
sleep begin
sleep end
timer tick
0 1 2 3 4 5 6 7 8 9 A B C D E F
00000000h: 61 61 61 61 61 61 61 61
lens:8
0 1 2 3 4 5 6 7 8 9 A B C D E F
00000000h: 62 62 62 62 62 62 62 62
lens:8
0 1 2 3 4 5 6 7 8 9 A B C D E F
00000000h: 63 63 63 63 63 63 63 63
lens:8
tmp->expire is not chaoshi
总结:链表共五个节点,每个节点相差1秒,按时间大小升序排列,链表头时间节点最小,依次递增。tick函数只处理链表中已经超时的节点,并打印buffer里的值。当休眠3秒时,链表中的前3个节点已经超时,剩下的2个节点没有超时,所以只打印前三个节点。
 |