バッファ操作 - rb_head_page_set()
概要
バッファのフラグを入れ替える
詳細
この関数では以下の引数を受け取る
- struct buffer_page型のポインタ : head
- headの前のバッファを指すポインタ : prev
- 現在のフラグを示す : old_flag
- 新しいフラグを示す : new_flag
cmpxchg()でheadのlistメンバとold_flagを論理和した値とprevのlistメンバから次のリストを示すnextメンバの値が一致した場合にheadのlistメンバのフラグをnew_flagに書き換える命令を実行する
実行結果とRB_FLAG_MASKを反転した値の論理積がheadのlistメンバの値と一致しない場合はRB_PAGE_MOVEDを、それ以外の場合は返り値とRB_FLAG_MASKの論理積(結果的にold_flagになるはずの値)を返す
従って、前のバッファの次のバッファが現在のバッファと一致しないときはRB_PAGE_MOVEDを返し、既に移動済みのバッファであることを意味する