#author("2025-10-31T11:10:43+09:00","default:guest","guest")
#author("2025-10-31T11:11:52+09:00","default:guest","guest")
*参照元 [#p6102cb6]
#backlinks

*説明 [#qea901e7]
-パス: [[linux-5.15/include/linux/list.h]]

-FIXME: これは何?
--説明
-リストの先頭、リストを含む構造体のポインタを取得するマクロ。リストが空ならばNULLを返す。


**引数 [#te6c25a2]
-struct list_head *ptr
--構造体内のリスト先頭へのポインタを指定する。
--struct list_head *以外の型を指定してもコンパイルエラーにはならないが、struct list_head *以外の型のポインタから構造体のポインタを求めたい場合はcontainer_of()を使った方が良い。
--[[linux-5.15/list_head]]
-type
--ptr に指定したポインタが指すメンバ、これを含む「構造体名」を指定する。マクロはここで指定した型のポインタを返す。
-member
--ptr に指定したポインタが指す「メンバ名」を指定する。
--type に指定した型は member に指定した名前のメンバを持っていないとコンパイルエラーになる。


**返り値 [#n5479653]
-type *
--例えばlist_first_entry_or_null(a, struct hogehoge, b)とすれば、struct hogehoge *が返ってくる。
--list_entry()と同じ仕様。
--[[linux-5.15/list_entry()]]


**参考 [#pba35294]


*実装 [#tbbfed97]

 /**
  * list_first_entry_or_null - get the first element from a list
  * @ptr:	the list head to take the element from.
  * @type:	the type of the struct this is embedded in.
  * @member:	the name of the list_head within the struct.
  *
  * Note that if the list is empty, it returns NULL.
  */
 #define list_first_entry_or_null(ptr, type, member) ({ \
 	struct list_head *head__ = (ptr); \

-ptrを一度だけ評価するため一旦変数に代入する。マクロの場合は、ptrに副作用がある場合(インクリメントなど)にptrを何度も評価すると、副作用が何度も発生してしまう。

 	struct list_head *pos__ = READ_ONCE(head__->next); \
 	pos__ != head__ ? list_entry(pos__, type, member) : NULL; \
 })

-nextが自分を指している(つまりリストが空)場合はNULL、そうでなければnextが指している要素(= 先頭の要素)
--[[linux-5.15/list_head]]
--[[linux-5.15/READ_ONCE()]]
--[[linux-5.15/list_entry()]]


*コメント [#a9e17acf]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS