ただただしです。

On Sun, 25 Feb 2001 01:28:14 +0900 Keisuke Minami <keisuke / rccn.com> wrote:
>私の方ではこんな風にやっていますよ。
>#あのページを参考にして
>イテレータを使って、ブロックの中に入れるので
>ロック解除の処理を書かずにすむのが楽ですね。

 前のロックの痕跡が残っている状態で、同時に2つのプロセスが飛び込ん
だらまずいような気がするんですがどうでしょう。rescue内のrenameがさら
に失敗する場合がありませんか?

 私も真似させてもらって、こんな感じに書いてみました。ロックファイル
名には気休めにpidも入れてあります:-)

--------------------------
module Lock
  class LockError < StandardError; end

  def Lock::lock( basefile = 'lock/lock', try = 10, timeout = 600 )
    locking = false
    lockfile = "#{basefile}.#{Process::pid}.#{Time.now.to_i}"
    1.upto( try ) do |time|
      begin
        File.rename( basefile, lockfile )
        locking = true
        break
      rescue #rename failed
        begin
          Dir.glob( "#{basefile}.*" ).each do |oldlock|
            if /^#{basefile}\.\d+\.(\d+)/ =~ oldlock and
                Time.now.to_i - $1.to_i > timeout then
              File.rename( oldlock, lockfile )
              locking = true
              break
            end
          end
        rescue
        end
      end
      sleep( 1 )
    end
    raise Lock::LockError, "LockError: #{lockfile} #{$!}" unless locking
    begin
      yield
    ensure
      File.rename( lockfile, basefile ) if locking
    end
  end
end
---------------------

#るびきちさんの言うように、テストが難しいので完璧じゃないかも。

■■ Don't Think, Buuuuy. ■■
■  た   だ   た   だ   し  ■
■http://www.spc.gr.jp/sho/