代码之家  ›  专栏  ›  技术社区  ›  bornfree

了解Linux内核中每个条目的hlist_bl_

  •  1
  • bornfree  · 技术社区  · 6 年前

    在浏览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() 去拿牙齿。我不明白的是线路

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

    它得到了TPO。1在这里有什么用?如何理解for循环中的这种情况?

    1 回复  |  直到 6 年前
        1
  •  2
  •   a3f    6 年前

    如果您编写的是无宏的,它可能会如下所示:

    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 块在无宏版本中,您需要 tpos '每次设置的值 pos 为非NULL,因此可以在 pos && :

    pos && (tpos = hlist_bl_entry(pos, typeof(*tpos), member))
    

    但现在tops非Null变成了循环条件,所以您告诉C ignore the return value :

    pos && ((tpos = hlist_bl_entry(pos, typeof(*tpos), member)), 1)
    

    但是内核代码是GNU C,所以您可以使用 statement expressions 而是:

    pos && ({ tpos = hlist_bl_entry(pos, typeof(*tpos), member); 1; })