aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/lock_file.rb
diff options
context:
space:
mode:
authorMarkus Reiter2017-05-22 03:23:50 +0200
committerMarkus Reiter2017-05-25 06:18:52 +0200
commit060af0a26ab7219e46b500fd1c7f420b6cc74cbb (patch)
tree649593bf35ab82c344d7f7ca9456f26d118f6f45 /Library/Homebrew/lock_file.rb
parente931fee732d9d8d34eb9d689782bafb3822302f7 (diff)
downloadbrew-060af0a26ab7219e46b500fd1c7f420b6cc74cbb.tar.bz2
Rename `FormulaLock` to `LockFile`.
Diffstat (limited to 'Library/Homebrew/lock_file.rb')
-rw-r--r--Library/Homebrew/lock_file.rb49
1 files changed, 49 insertions, 0 deletions
diff --git a/Library/Homebrew/lock_file.rb b/Library/Homebrew/lock_file.rb
new file mode 100644
index 000000000..83743b744
--- /dev/null
+++ b/Library/Homebrew/lock_file.rb
@@ -0,0 +1,49 @@
+require "fcntl"
+
+class LockFile
+ def initialize(name)
+ @name = name
+ @path = HOMEBREW_LOCK_DIR/"#{@name}.lock"
+ @lockfile = nil
+ end
+
+ def lock
+ @path.parent.mkpath
+ create_lockfile
+ return if @lockfile.flock(File::LOCK_EX | File::LOCK_NB)
+ raise OperationInProgressError, @name
+ end
+
+ def unlock
+ return if @lockfile.nil? || @lockfile.closed?
+ @lockfile.flock(File::LOCK_UN)
+ @lockfile.close
+ end
+
+ def with_lock
+ lock
+ yield
+ ensure
+ unlock
+ end
+
+ private
+
+ def create_lockfile
+ return unless @lockfile.nil? || @lockfile.closed?
+ @lockfile = @path.open(File::RDWR | File::CREAT)
+ @lockfile.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
+ end
+end
+
+class FormulaLock < LockFile
+ def initialize(name)
+ super("#{name}.formula")
+ end
+end
+
+class CaskLock < LockFile
+ def initialize(name)
+ super("#{name}.cask")
+ end
+end