Spec-Zone.ru › Homebrew

Класс: LockFile Приватный

Наследуется от:
Object
  • Object
  • LockFile
показать все
Подключает:
Utils::Output::Mixin
Определён в:
lock_file.rb

Обзор

Этот класс является частью приватного API. Этот класс можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого класса, так как он может быть удалён или изменён без предупреждения.

Файл блокировки, предотвращающий изменение одного и того же пути несколькими процессами Homebrew.

Прямые известные подклассы

CaskLock, DownloadLock, FormulaLock

Краткое описание атрибутов экземпляра свернуть

  • #path ⇒ Pathname только для чтения приватный

Краткое описание методов экземпляра свернуть

  • #initialize(type, locked_path) ⇒ void конструктор приватный
  • #lock ⇒ void приватный
  • #unlock(unlink: false) ⇒ void приватный
  • #with_lock(&_block) ⇒ void приватный

Методы, подключённые из Utils::Output::Mixin

#issue_reporting_message, #odebug, #odeprecated, #odie, #odisabled, #ofail, #oh1, #oh1_title, #ohai, #ohai_title, #onoe, #opoo, #opoo_outside_github_actions, #opoo_without_github_actions_annotation, #pretty_deprecated, #pretty_disabled, #pretty_duration, #pretty_install_status, #pretty_installed, #pretty_uninstalled, #pretty_upgradable, #pretty_warning

Подробное описание конструкторов

#initialize(type, locked_path) ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

Параметры:

  • type (Symbol)
  • locked_path (Pathname)


18
19
20
21
22
23
# File 'lock_file.rb', line 18

def initialize(type, locked_path)
  @locked_path = locked_path
  lock_name = locked_path.basename.to_s
  @path = T.let(HOMEBREW_LOCKS/"#{lock_name}.#{type}.lock", Pathname)
  @lockfile = T.let(nil, T.nilable(File))
end

Подробное описание атрибутов экземпляра

#path ⇒ Pathname (только для чтения)

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

Возвращает:

  • (Pathname)


15
16
17
# File 'lock_file.rb', line 15

def path
  @path
end

Подробное описание методов экземпляра

#lock ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lock_file.rb', line 26

def lock
  ignore_interrupts do
    next if @lockfile.present?

    path.dirname.mkpath

    begin
      lockfile = begin
        File.open(path, File::RDWR | File::CREAT)
      rescue Errno::EMFILE
        odie "The maximum number of open files on this system has been reached. " \
             "Use `ulimit -n` to increase this limit."
      end
      lockfile.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)

      if lockfile.flock(File::LOCK_EX | File::LOCK_NB)
        # This prevents a race condition in case the file we locked doesn't exist on disk anymore, e.g.:
        #
        # 1. Process A creates and opens the file.
        # 2. Process A locks the file.
        # 3. Process B opens the file.
        # 4. Process A unlinks the file.
        # 5. Process A unlocks the file.
        # 6. Process B locks the file.
        # 7. Process C creates and opens the file.
        # 8. Process C locks the file.
        # 9. Process B and C hold locks to files with different inode numbers. 💥
        if !path.exist? || lockfile.stat.ino != path.stat.ino
          lockfile.close
          raise OpenFileChangedOnDisk
        end

        @lockfile = lockfile
        next
      end
    rescue OpenFileChangedOnDisk
      retry
    end

    lockfile.close
    raise OperationInProgressError, @locked_path
  end
end

#unlock(unlink: false) ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.

Параметры:

  • unlink (Boolean) (по умолчанию: false)


71
72
73
74
75
76
77
78
79
80
# File 'lock_file.rb', line 71

def unlock(unlink: false)
  ignore_interrupts do
    next if @lockfile.nil?

    @path.unlink if unlink
    @lockfile.flock(File::LOCK_UN)
    @lockfile.close
    @lockfile = nil
  end
end

#with_lock(&_block) ⇒ void

Этот метод является частью приватного API. Этот метод можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.

Этот метод возвращает неопределённое значение.

Параметры:

  • _block (T.proc.void)


83
84
85
86
87
88
# File 'lock_file.rb', line 83

def with_lock(&_block)
  lock
  yield
ensure
  unlock
end

© 2009–present Homebrew contributors
Licensed under the BSD 2-Clause License.
https://docs.brew.sh/rubydoc/LockFile.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API