51 lines
1.1 KiB
Ruby
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
|