after_fork(child: true)
click to toggle source
def after_fork child: true
if child || !@lock_file
@m = Mutex.new
@lock_level = 0
@lock_file = open(@lock_tempfile.path, 'w')
end
end
info(msg)
click to toggle source
def info msg
DEBUGGER__.info "#{msg} (#{@lock_level})"
end
lock()
click to toggle source
def lock
unless trylock
@m.synchronize do
if locked?
lock_level_up
else
info "Lock: block"
@lock_file.flock(File::LOCK_EX)
lock_level_up
end
end
info "Lock: success"
end
end
locked?()
click to toggle source
def locked?
@lock_level > 0
end
multi_process!()
click to toggle source
sync(&b)
click to toggle source
def sync &b
info "sync"
lock
begin
b.call if b
ensure
unlock
end
end
unlock()
click to toggle source
def unlock
@m.synchronize do
raise "lock file is not opened (#{@lock_file.inspect})" if @lock_file.closed?
lock_level_down
@lock_file.flock(File::LOCK_UN) unless locked?
info "Unlocked"
end
end