LinuxのFSモジュールを書いてみる (その2)

追記: コードに深刻な勘違いがあったので修正。

前回は、ひとまず次のような機能を実装したモジュールを書いた。

  1. ディレクトリを開く
  2. ディレクトリのエントリの一覧を取得する
  3. ディレクトリのエントリの属性を取得する
  4. ファイルを開く
  5. ファイルの内容を読む

これに、

  1. ファイルに対して 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) から戻ってくることが分かると思う。