*参照元 [#m62d0c0b] #backlinks *説明 [#x17af451] -パス: [[linux-2.6.33/include/linux/list.h]] -指定された要素に挟まれた要素全てを、リストから削除する。 --指定された要素は残り、間にある要素が全て削除される。 元のリストが、 ,-------------------------, |-> a <-> b <-> c <-> d <-| であれば、 __list_del(b, d) を実行後は、 ,-------------------, |-> a <-> b <-> d <-| となる。 --リストの要素が 1つでも動作する。 ---b を削除したければ、__list_del(a, a) で削除可能である。 a は b の prev であり、next でもあるから。 --間に何も要素がなくても動作する。 空のリストに対しても動作する。 ---特に何も起こらない。 **引数 [#vf05a208] -struct list_head * prev --削除したい要素の前にある要素を指定する。 --[[linux-2.6.33/list_head]] -struct list_head * next --削除したい要素の後ろにある要素を指定する。 **返り値 [#x61ee993] -なし **参考 [#v4d1ffd3] *実装 [#jfd0f73e] /* * Delete a list entry by making the prev/next entries * point to each other. * * This is only for internal list manipulation where we know * the prev/next entries already! */ static inline void __list_del(struct list_head * prev, struct list_head * next) { next->prev = prev; prev->next = next; -削除対象の全要素を挟む要素間で、ポインタを接続する。 仮に prev と next の間にある全要素 (=リストから削除しようとしている要素全て) の名前を self とすると、 | prev | -(prev.next)-> | self | -(self.next)-> | | | | <-(self.prev)- | | <-(next.prev)- | next | を | prev | -------------(prev.next)-------------> | | | | <-------------(next.prev)------------- | next | ^ ^ | | self | ---(self.next)---| `---(self.prev)--- | | のように変更して、prev や next から self を参照できないようにする。 これは self が複数となっても動作する。 } *コメント [#qbe14560]