vaguerent/lib/vagrant/util/file_mutex.rb

51 lines
1.1 KiB
Ruby

# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: BUSL-1.1
module Vagrant
module Util
# Utility to provide a simple mutex via file lock
class FileMutex
# Create a new FileMutex instance
#
# @param mutex_path [String] path for file
def initialize(mutex_path)
@mutex_path = mutex_path
end
# Execute provided block within lock and unlock
# when completed
def with_lock(&block)
lock
begin
block.call
rescue => e
raise e
ensure
unlock
end
end
# Attempt to acquire the lock
def lock
if lock_file.flock(File::LOCK_EX|File::LOCK_NB) === false
raise Errors::VagrantLocked, lock_file_path: @mutex_path
end
end
# Unlock the file
def unlock
lock_file.flock(File::LOCK_UN)
lock_file.close
File.delete(@mutex_path) if File.file?(@mutex_path)
end
protected
def lock_file
return @lock_file if @lock_file && !@lock_file.closed?
@lock_file = File.open(@mutex_path, "w+")
end
end
end
end