📄 mytimerheap.h
字号:
/***mytimerheap.h 定时堆 lin shao chuan**/#ifndef __MYTIMERHEAP_H__#define __MYTIMERHEAP_H__#include "mymempool.h"#ifdef WIN32#include <winsock2.h>#endiftypedef struct __mytimerheap_handle_{int unused;}*HMYTIMERHEAP;typedef void * HTIMERID;/**超时触发的回调函数*@param context_data:触发回调时的用户上下文 timer_user_data:定时器节点相关的用户数据 timerid:定时器的id*/typedef int (*MY_TIMER_HEAP_TIMEOUT_CB)(unsigned long context_data, unsigned long timer_user_data);typedef struct __mytimer_node_t_{ unsigned long context_data; /*触发回调时的用户上下文*/ unsigned long timer_user_data; /*定时器节点相关的用户数据*/ MY_TIMER_HEAP_TIMEOUT_CB timeout_cb; /*定时器回调函数*/ struct timeval period; /* 定时超时间隔*/ struct timeval first_expire; /* <第一次> 相对超时时间*/ struct timeval abs_expire; /* <下一次> 绝对超时时间 */}mytimer_node_t;/***t1是否小于t2**/#define timeval_smaller(t1, t2) \ ( ((t1).tv_sec < (t2).tv_sec) ? 1 : ( (((t1).tv_usec < (t2).tv_usec) && ((t1).tv_sec == (t2).tv_sec)) ? 1:0) )/***t1是否大于t2**/#define timeval_greater(t1, t2) \ ( ((t1).tv_sec > (t2).tv_sec) ? 1 : ( (((t1).tv_usec > (t2).tv_usec) && ((t1).tv_sec == (t2).tv_sec)) ? 1:0) )/***t1 += t2**/#define timeval_add(t1, t2) do{\ (t1).tv_sec += (t2).tv_sec;\ (t1).tv_usec += (t2).tv_usec;\ if((t1).tv_usec >= (1000 * 1000))\ {\ (t1).tv_sec += (t1).tv_usec/(1000 * 1000);\ (t1).tv_usec = (t1).tv_usec % (1000 * 1000);\ }\ else if((t1).tv_usec < 0 && (t1).tv_sec >= 1)\ {\ (t1).tv_sec -= -1;\ (t1).tv_usec = 1000 * 1000 + (t1).tv_usec;\ }\}while(0)/***t1 -= t2**/#define timeval_minus(t1, t2) do{\ (t1).tv_sec -= (t2).tv_sec;\ (t1).tv_usec -= (t2).tv_usec;\ if((t1).tv_usec >= (1000 * 1000))\ {\ (t1).tv_sec += (t1).tv_usec/(1000 * 1000);\ (t1).tv_usec = (t1).tv_usec % (1000 * 1000);\ }\ else if((t1).tv_usec < 0 && (t1).tv_sec >= 1)\ {\ (t1).tv_sec -= 1;\ (t1).tv_usec = 1000 * 1000 + (t1).tv_usec;\ }\}while(0)/*** 构造定时堆**/extern HMYTIMERHEAP MyTimerHeapConstruct(HMYMEMPOOL hm);/*** 析构定时堆**/extern void MyTimerHeapDestruct(HMYTIMERHEAP hth);/*** 添加定时器**@param mytimer_node_t * node:定时器节点*@retval 定时器的id NULL:失败**/extern HTIMERID MyTimerHeapAdd(HMYTIMERHEAP hth, mytimer_node_t * node);/*** 删除定时器**/extern int MyTimerHeapDel(HMYTIMERHEAP hth, HTIMERID timerid);/*** 重置定时器**@param mytimer_node_t * node:定时器节点*@retval 定时器的id NULL:失败**/extern HTIMERID MyTimerHeapReset(HMYTIMERHEAP hth, HTIMERID timerid, mytimer_node_t * node);/*** 获取头节点,即绝对超时最小(最早超时)的键值**/extern HTIMERID MyTimeHeapGetEarliestKey(HMYTIMERHEAP hth);/*** 获取最小超时(绝对时间)**@retval 0:成功 -1:失败**/extern int MyTimerHeapGetEarliestExpire(HMYTIMERHEAP hth, struct timeval * expire);/*** 触发所有超时事件**@retval 超时个数**/extern unsigned MyTimerHeapRunExpire(HMYTIMERHEAP hth, struct timeval * tv_now);/*** 获取定时器的个数**/extern size_t MyTimerHeapGetCount(HMYTIMERHEAP hth);#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -