+ -
当前位置:首页 → 问答吧 → 关于Linux内核中哈希链表遍历宏的问题

关于Linux内核中哈希链表遍历宏的问题

时间:2010-07-03

来源:互联网

本帖最后由 jiufei19 于 2010-07-03 16:23 编辑

918 #define hlist_for_each_entry(tpos, pos, head, member)            \
919     for (pos = (head)->first;                    \
920          pos && ({ prefetch(pos->next); 1;}) &&          \
921         ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
922          pos = pos->next)

这是linux内核中hash链表的遍历操作,在阅读此代码时我有两个地方不清楚,望各位前辈指教

1、为了简化在用户态下的程序使用,我将prefetch去掉了,功能是正确的,只是这样有什么不好吗?
2、{ prefetch(pos->next); 1;}和{ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}中的: ; 1;到底是用来干啥的?

作者: jiufei19   发布时间: 2010-07-03

prefetch是用来预取的,有的体系架构支持预取,有的不支持,x86应该是不支持的,在x86上这个宏就是空的

作者: cugb_cat   发布时间: 2010-07-03

回复 cugb_cat


        谢谢cugb_cat的答复,那么另外一个问题就是这里的如下复合语句的用途是为了什么?

({ prefetch(pos->next); 1;}) &&          \



({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \

这里都有一个1,似乎前面的所有内容等于何种值都没有意义了,因为都是1,麻烦cgub_cat帮我解答下,谢谢!

作者: jiufei19   发布时间: 2010-07-04



QUOTE:
回复  cugb_cat


        谢谢cugb_cat的答复,那么另外一个问题就是这里的如下复合语句的用途是为了什 ...
jiufei19 发表于 2010-07-03 18:19




    gcc的扩展,({ ...; ...; }) 是一个表达式,它的值是其最后一个表达式的值。与逗号表达式不同的是它前面可以是statements,比如变量定义等,不需要是表达式。

http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#SEC62

作者: emacsnw   发布时间: 2010-07-04

本帖最后由 jiufei19 于 2010-07-04 19:24 编辑

回复 emacsnw


        十分感谢emacsnw的解答! 那么这里始终用1来作为最后一个值到底是什么意思呢?

作者: jiufei19   发布时间: 2010-07-04