一、超时事件处理简介
为每个与外界网络连接的任务都设定了timeout属性,即等待超时时间,例如TCP建立连接超时、ARP缓存表项的时间管理等,都需要超时操作来处理
二、超时事件如何管理
申请所需的超时事件
/* 轮询超时事件结构体 */
typedef void (* lwip_cyclic_timer_handler)(void);
struct lwip_cyclic_timer
{
u32_t interval_ms; /* 超时时间 */
lwip_cyclic_timer_handler handler; /* 超时处理函数 */
};
管理超时事件
typedef void (* sys_timeout_handler)(void *arg);
struct sys_timeo
{
struct sys_timeo *next; /* 下一个超时事件的指针 */
u32_t time; /* 当前超时事件的等待时间 */
sys_timeout_handler h; /* 指向超时的回调函数 */
void *arg; /* 超时的回调函数形数 */
};
三、超时事件如何注册
void sys_timeouts_init(void)
{
size_t i; /* 遍历轮询超时事件数组 */
for (i = (LWIP_TCP ? 1 : 0); i < LWIP_ARRAYSIZE(lwip_cyclic_timers); i++)
{
/* 注册超时事件 */
sys_timeout(lwip_cyclic_timers[i].interval_ms, lwip_cyclic_timer,
LWIP_CONST_CAST(void *, &lwip_cyclic_timers[i]));
}
}
四、超时事件如何删除
void sys_untimeout(sys_timeout_handler handler, void *arg)
{
struct sys_timeo *prev_t, *t;
if (next_timeout == NULL){
return;
}
/* 从链表头开始遍历这个链表 */
for (t = next_timeout, prev_t = NULL; t != NULL; prev_t = t, t = t->next){
/* 查找删除的超时事件,判断超时事件的回调函数与函数参数释放一致 */
if ((t->h == handler) && (t->arg == arg))
{
if (prev_t == NULL) {
next_timeout = t->next; }
else {
prev_t->next = t->next; }
memp_free(MEMP_SYS_TIMEOUT, t);
return;
}
}
return;
}