atomic操作 - __read_once_size
概要
指定された値を指定されたsizeでatomicに読み込む
詳細
__READ_ONCE_SIZEマクロを展開し実行する __READ_ONCE_SIZEマクロは以下の変数が宣言されている前提で実行する
- 値のsizeを示すsize
- 読込元の値のポインタを示すp
- 返り値のポインタを示すres
また、sizeによって処理が変わるが、大きく以下の2種類に別れる
- sizeが8バイト以下
- pの値をvolatile修飾子で最適化を抑制した状態で返り値resに代入する
- sizeが8バイト以上
- *1__builtin_memcpy()でpの値をresにコピーするが実行前と実行後にbarrier()を実行することで、コピー時のpの値が現在設定されている値であること、コピー後のresの値がコピーした値であることを保証している