list_for_each_entry重置光标

时间:2013-05-21 02:45:36

标签: linux list cursor kernel

您好,我是新手,我尝试使用list_for_each_entry迭代列表。它看起来像这样

list_for_each_entry(pos, head, member){
    if (something == pos.x)
    //reset the loop cursor so that it starts iterating all over again
}

如何在不使用goto的情况下执行注释部分?还有一件事是,在list_for_each_entry中使用break / continue是否安全,或者是否有任何可用的功能来实现这一目标?

感谢。

1 个答案:

答案 0 :(得分:0)

查看list_for_each_entry

的定义
#define list_for_each_entry(pos, head, member)              \
for (pos = list_entry((head)->next, typeof(*pos), member);  \
     &pos->member != (head);    \
     pos = list_entry(pos->member.next, typeof(*pos), member))

来自https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/list.h?id=refs/tags/v3.10-rc2#n418

如你所见,这被定义为一个简单的for循环,这里没有黑魔法,你可以使用continue / break。

对于你的其他问题,我想这取决于你为什么要这样做。最简单的方法是:

int iterateAgain = 0;
list_for_each_entry(pos, head, member) {
   // (...)
   if (something == pos.x) {
       iterateAgain = 1;
       break;
    }
}
if (iterateAgain) {
    list_for_each_entry(pos, head, member) {
        // (...)
    }
}

但是根据你的代码,它可能太冗余等等。你也可以有一个递归函数。有很多方法可以做到这一点。

评论后编辑:

int keepIterating;
do {
    keepIterating = 0;
    list_for_each_entry(pos, head, member) {
       // (...)
       if (something == pos.x) {
           keepIterating = 1;
           break;
        }
    }
} while (keepIterating);