簡體   English   中英

了解Linux內核中的hlist_bl_for_each_entry_rcu宏

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM