aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/formula_lock.rb
blob: bf747fea224065c57e077841873af4c59ab4831f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
require "fcntl"

class FormulaLock
  def initialize(name)
    @name = name
    @path = HOMEBREW_LOCK_DIR/"#{@name}.brewing"
    @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