双链表小试牛刀-模块代码-源码list_for_each有bug需要do-while缓解尴尬-增加另外一个办法待测试

单独分析:

//遍历链表 周期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();
            }
        }
    }

	}


}

 

你可能感兴趣的:(双链表小试牛刀-模块代码-源码list_for_each有bug需要do-while缓解尴尬-增加另外一个办法待测试)