blob: 0eeb27c84e18676dd253a1721923dd118177f6d9 (
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
38
39
40
41
42
43
44
45
 | require 'fcntl'
class FormulaLock
  LOCKDIR = HOMEBREW_CACHE_FORMULA
  def initialize(name)
    @name = name
    @path = LOCKDIR.join("#{@name}.brewing")
    @lockfile = nil
  end
  def lock
    LOCKDIR.mkpath
    @lockfile = get_or_create_lockfile
    unless @lockfile.flock(File::LOCK_EX | File::LOCK_NB)
      raise OperationInProgressError, @name
    end
  end
  def unlock
    unless @lockfile.nil? || @lockfile.closed?
      @lockfile.flock(File::LOCK_UN)
      @lockfile.close
    end
  end
  def with_lock
    lock
    yield
  ensure
    unlock
  end
  private
  def get_or_create_lockfile
    if @lockfile.nil? || @lockfile.closed?
      @lockfile = @path.open(File::RDWR | File::CREAT)
      @lockfile.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
      @lockfile
    else
      @lockfile
    end
  end
end
 |