![](/img/trans.png)
[英]Ask for explanation of a kernel macro: hlist_nulls_for_each_entry
[英]Understanding hlist_bl_for_each_entry_rcu macro in Linux Kernel
瀏覽Linux內核源代碼時,我發現了hlist_bl_for_each_entry_rcu
宏,下面是它的定義
for (pos = hlist_bl_first_rcu(head); \
pos && \
({ tpos = hlist_bl_entry(pos, typeof(*tpos), member); 1; }); \
pos = rcu_dereference_raw(pos->next))
__d_lookup()
使用此宏來獲取__d_lookup()
。 我不明白的是線
({ tpos = hlist_bl_entry(pos, typeof(*tpos), member); 1; });
它得到了tpos。 1在這里有什么用? 如何在for循環中了解這種情況?
如果您將其編寫為無宏,則可能看起來像這樣:
for (pos = hlist_bl_first_rcu(head); pos; pos = rcu_dereference_raw(pos->next)) {
tpos = hlist_bl_entry(pos, typeof(*tpos), member);
/* do something with pos and tpos */
}
對於宏,您需要移動tpos = hlist_bl_entry(pos, typeof(*tpos), member);
放入for (...)
,因此用戶僅需提供for
塊。 在無宏版本中,您希望每次pos
為非NULL時都設置tpos
'值,因此您可以在pos &&
之后的循環條件中添加它:
pos && (tpos = hlist_bl_entry(pos, typeof(*tpos), member))
但現在非空值成為循環條件,因此您告訴C 忽略返回值 :
pos && ((tpos = hlist_bl_entry(pos, typeof(*tpos), member)), 1)
但是內核代碼仍然是GNU C,因此您可以改用語句表達式 :
pos && ({ tpos = hlist_bl_entry(pos, typeof(*tpos), member); 1; })
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.