bio.c void bwrite(struct buf *b)
トップページ
jupiteroak.hatenablog.com
bio.c
https://github.com/mit-pdos/xv6-public/blob/master/bio.c#L109
void bwrite(struct buf *b) { if(!holdingsleep(&b->lock)) panic("bwrite"); b->flags |= B_DIRTY; iderw(b); }
bwrite関数は、バッファbに格納されているデータを、バッファbに対応しているハードディスク上のセクタへ書き出します。
引数 struct buf *b
ハードディスクへ書き出すデータを保存しているバッファを指定するアドレスです。
処理の内容
現在実行中のプロセスがスリープロックを保持していることを確認する
if(!holdingsleep(&b->lock)) panic("bwrite");
holdingsleep関数を呼び出して、現在実行中のプロセスがスリープロックを保持しているかを確認します。!holdingsleep(&b->lock)が真となる場合→holdingsleep関数の戻り値が0となる場合→スリープロックを保持していない場合は、panic関数を呼び出してメッセージを出力します。
バッファの状態を示すフラグを変更する
b->flags |= B_DIRTY;
B_DIRTY(#define B_DIRTY 0x4)をビット和代入することで、flagsメンバのbit2のみを1に設定します。バッファbのflagsメンバのbit2が1の時、バッファbが保存しているデータをハードディスクへ書き出す必要がある状態であることを示しています。
ハードディスクへの書き出し処理を行う
iderw(b);
iderw関数を呼び出して、バッファbからハードディスクへの書き出し処理を開始させます。