Sha256: d4b9656eb1ac735247356d59510e4be5f9b7b11b2ed445305bde3fa2ab89a9ff

Contents?: true

Size: 1.98 KB

Versions: 7

Compression:

Stored size: 1.98 KB

Contents

require "fileutils"

# File.flockを利用したRead-Write-Lock
class FileLock
  def initialize(lockfile)
    @lockfile = lockfile
  end

  #===読み込みロックする。
  #- ロックされていても他の読み込みユーザーはブロックさない。
  #- 他の書き込みユーザーはブロックされる。
  def readlock ( &block )
    File.open( @lockfile, "r" ) { |f|
      f.flock(File::LOCK_SH)
      begin
        block.call(f)
      ensure
        f.flock(File::LOCK_UN)
      end
    }
  end

  #===書き込みロックする。
  #- ロックされている場合、他の読み込みユーザー/書き込みユーザー共にブロックされる。
  def writelock ( &block )
    File.open( @lockfile, "w" ) { |f|
      f.flock(File::LOCK_EX)
      begin
        block.call(f)
      ensure
        f.flock(File::LOCK_UN)
      end
    }
  end

end

class DirLock
  def initialize(lockdir)
    @lockfile = "#{lockdir}/.lock"
  end

  #===読み込みロックする。
  #- ロックされていても他の読み込みユーザーはブロックさない。
  #- 他の書き込みユーザーはブロックされる。
  def readlock ( &block )
    mkfile
    File.open( @lockfile, "r" ) { |f|
      f.flock(File::LOCK_SH)
      begin
        block.call
      ensure
        f.flock(File::LOCK_UN)
      end
    }
  end

  #===書き込みロックする。
  #- ロックされている場合、他の読み込みユーザー/書き込みユーザー共にブロックされる。
  def writelock ( &block )
    mkfile
    File.open( @lockfile, "w" ) { |f|
      f.flock(File::LOCK_EX)
      begin
        block.call
      ensure
        f.flock(File::LOCK_UN)
      end
    }
  end

private
  def mkfile
    i=0
    while !File.exist?(@lockfile)
      begin
        FileUtils.touch( @lockfile )
        sleep 0.1
      rescue Exception
        i+=1
        raise $! if i >= 5
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 2 rubygems

Version Path
unageanu-jiji-1.2.1 lib/jiji/util/file_lock.rb
unageanu-jiji-1.2.3 lib/jiji/util/file_lock.rb
unageanu-jiji-1.2.4 lib/jiji/util/file_lock.rb
jiji-1.2.8 lib/jiji/util/file_lock.rb
jiji-1.2.7 lib/jiji/util/file_lock.rb
jiji-1.2.6 lib/jiji/util/file_lock.rb
jiji-1.2.5 lib/jiji/util/file_lock.rb