单独分析:
//遍历链表 周期loop执行
void once_timer_list_loop( void )
{
struct list_head *pos;
node_oncetime_type *priv;
if( Soncetimerhead == NULL) return;
list_for_each(pos, &Soncetimerhead->list)
// for (pos = (head)->next; pos != (head); pos = pos->next)
{
priv = list_entry(pos, node_oncetime_type, list);
if( priv->start)
{
if( ++priv->cnt >= priv->time_out)
{
priv->cnt = 0;
if(priv->fun != NULL) priv->fun();
}
}
}
}
这个写法有问题!根源在于list_for_each 你看上面的代码for循环 并不会执行唯一的那个节点!而这个节点是有数据的!
怎么办?
1使用do-while缓解尴尬
2处理一下 如果只有一个节点就if否则是多个节点就else
//遍历链表 周期loop执行
void once_timer_list_loop( void )
{
struct list_head *pos;
node_oncetime_type *priv;
if( Soncetimerhead == NULL) return;
pos = (&Soncetimerhead->list)->next;
do
{
priv = list_entry(pos, node_oncetime_type, list);
if( priv->start)
{
if( ++priv->cnt >= priv->time_out)
{
priv->cnt = 0;
if(priv->fun != NULL) priv->fun();
}
}
pos = pos->next;
}while( pos != (&Soncetimerhead->list));
}
void once_timer_list_loop( void )
{
struct list_head *pos;
node_oncetime_type *priv;
if( Soncetimerhead == NULL) return;//链表还没有建立
if(list_empty(Soncetimerhead))//只有一个节点
{
priv = Soncetimerhead;
if( priv->start)
{
if( ++priv->cnt >= priv->time_out)
{
priv->cnt = 0;
if(priv->fun != NULL) priv->fun();
}
}
}
else
{
list_for_each(pos, &Soncetimerhead->list)//最初的函数
{
priv = list_entry(pos, node_oncetime_type, list);
if( priv->start)
{
if( ++priv->cnt >= priv->time_out)
{
priv->cnt = 0;
if(priv->fun != NULL) priv->fun();
}
}
}
}
}