Lions' 本読み (92)

朝練メモ。ついに 15 章に突入。
入出力完了待ち、なループがどうやって終わるか、に心を奪われています。

5214    while((*fp&B_DONE)==0)
5215            sleep(fp, PSWP);

つうかまず sleep が何契機で wakeup されるか、てのもナニ。

うをを

色々な不具合の後にようやく着手。そしてテキストに以下な記述を発見。

sleep への第一パラメータが実際には swbuf のアドレスであることに注意してほしい。

Lions' Commentary on UNIX より引用
ヤられました。struct buf の定義が以下。

4520 struct buf
4521 {
4522    int        b_flags;

swap 手続きで fp という変数に b_flags 属性のアドレスを格納してますが

5200    fp = &swbuf.b_flags;

これは &swbuf を fp に代入するのと同じコトなのかorz
であれば iodone とかでも wakeup してるを確認済み。

5026    rbp->b_flags =| B_DONE
5027    if (rbp->b_flags&B_ASYNC)
5028            brelse(rbp);
5029    else {
5030            rbp->b_flags =& ~B_WANTED;
5031            wakeup(rbp);
5032    }

おそらくここですね。しかし b_flags 属性がいっちゃん先頭にある、ってトリックには気がつきませなんだ。