LinuxのFSモジュールを書いてみる (その2)
追記: コードに深刻な勘違いがあったので修正。
前回は、ひとまず次のような機能を実装したモジュールを書いた。
- ディレクトリを開く
- ディレクトリのエントリの一覧を取得する
- ディレクトリのエントリの属性を取得する
- ファイルを開く
- ファイルの内容を読む
これに、
- ファイルに対して poll 操作を行う
を加えてみた。
とりあえず実験なので、poll する対象として、適当なインターバルで動くタイマーを作ることにし、そのタイマーが期限を迎えたところで POLLIN イベントが発生するようにする。
vfs の poll の実装はレベルトリガーを前提としているので、フラグを用意しておいて、そのフラグがリセットされているときのみ待ち行列をwakeupするという形にする。フラグに対する操作はアトミックにしたいので、atomic_t を利用する。
フラグがリセットされるタイミングは、poll 操作が終わって、戻るタイミングすでにイベントが発生した状況で poll ハンドラが呼ばれた時点とする。本来であればこれは、同じファイルディスクリプタに対して複数のスレッドから poll することが当然考えられるので、でたらめなんだけど、実験なので。
/mnt/aho に my_vfs をマウントしておいて、次のテストコードを走らせると
from select import select f = open('/mnt/aho/a', 'r') while True: print select([f], [], [])
適当なタイミングで select(2) から戻ってくることが分かると思う。