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 属性がいっちゃん先頭にある、ってトリックには気がつきませなんだ。