ロック
プロセス間の同期化はロックを用いて行ないます。
&fml8; でサポートされているロックメカニズムは
flock(2) もしくは lockf(2) を元にしたロック機構のみです。
ロックの概要
ながらく giant lock でしたが、2003/03 に giant lock をなくしました。
現在では、いろいろなりソースごとに、ロックチャンネルが用意されています。
たとえば、Mail::Delivery 関連はメンバーリストにアクセスするので、
いろいろとロックが必要です。
Mail::Delivery::SMTP の操作の際にはメンバーリストのロックが必要です。
現在は、Mail::Delivery::SMTP を呼び出す FML のクラス(実は FML::Send と
FML::Process::Delivery の2箇所しかない)の中でロック処理をしています。
一方、Mail::Delivery::Queue は見るだけ (mailq コマンド)か、
並列操作可能なものだけなので、ロックは考えなくて良いはずです。
そして、reader writer lock まで大げさでなくとも
一般に map を使うモジュールにはロックが必要です。
write 用の lock が必要とは限りません。
たとえば
FML/Command/UserControl.pm
や
FML/Command/Auth.pm
には write 用の lock が必要ですが、
FML/Credential.pm
は read 用の lock だけでよいです。
しかしながら、いまのところ reader writer lock は実装されていませんので、
リソースごとの細かいロック制御で critical region
の時間を短くするようになっています。
TODO
*_maps をよぶ前には MUTEX でロックをする。いや、やりすぎかもしれません。
メンバーリストへ IO::Adapter をかます時に、
READER WRITER LOCK がほしい。
READ ロックは不要か?いや、だめだろ
chaddr の途中で sleep したら敗けやから;)
perl thread をつかえばできるけど、
汎用的な実装はかなりむつかしいぽい;)