インタラプトの実装・コミット

をしました。 前の記事(2007-03-01 - t-arakiの日記)で、read()とかのAPIを変えずにインタラプトを実現する、とか書きましたが、それはあきらめました。orz
というのは、操作が成功したかどうかが、「インタラプトがあったか」を調べるだけではわからないためです。例えばread()の場合、インタラプトが無ければ確実に成功ですが、あった場合でもタイミングによっては成功している可能性があります。したがって、インタラプトがあった場合、読んだ値が正しいかを別の方法で再チェックする必要があり、ちょっとややこしくなります。readはまだしも、writecdrの場合はもっとややこしくなり、あまりに素直でないのでやめてしまいました。
その代わり、timed系と同様に、intrread(status *s)のような、割り込みを許す操作を別に定義しました。割り込みが起った場合、引数に与えられたstatus変数の値をチェックすることで判定することができます。
通常のread()のセマンティクスは、これまでと同様、終了すれば成功です。内部的には、インタラプトがあっても操作が成功するまで最トライしています。すなわち、インタラプトでブロックから抜けて欲しい場合は、read()ではなくintrread()を使うなどする必要があります。
システムコール実行中にインタラプトを受けた場合、そのシステムコールから抜けます。システムコールの戻り値をチェックして、エラーの場合はpards_is_interrupted()をチェックすることで、インタラプトが原因かどうか確認できます。
あと、GTK+を使ったサンプルプログラムも、このインタラプト機構を使うように変更しました。CANCELボタンを押すとインタラプトがバックグラウンドで動作しているプロセスに送られ、表示の更新がとまります。
サンプルプログラムを書いているうちにも、いろいろプログラミング上ミスをおこし勝ちな場合があったので、難しいですね。インタラプトのタイミングがいつでも起りうるということをちゃんと考えないと…
もう少し検討が必要かも。