バグ

当然だが、UNIX第6版のカーネルにはバグがある。 ベル研から配布された「50の変更」の変更一覧diffにはバグの修正がふくまれている。

30) のsetpri()のバグをみてみよう。

2150 /*
2151  * Set user priority.
2152  * The rescheduling flag (runrun)
2153  * is set if the priority is higher
2154  * than the currently running process.
2155  */
2156 setpri(up)
2157 {
2158         register *pp, p;
2159 
2160         pp = up;
2161         p = (pp->p_cpu & 0377)/16;
2162         p =+ PUSER + pp->p_nice;
2163         if(p > 127)
2164                 p = 127;
2165         if(p > curpri)
2166                 runrun++;
2167         pp->p_pri = p;
2168 }
コメントの内容と比較すれば、2165行目の比較が
         if(p > curpri)
ではなく
         if(p < curpri)
でなければならいのはほとんど明らか といえる。Lions本の8章では曖昧な書き方がされていて、ちょっとおもしろい。


戻る