Класс: LockFile Приватный
- Наследуется от:
- Object
- Object
- LockFile
- Подключает:
- Utils::Output::Mixin
- Определён в:
- lock_file.rb
Обзор
Этот класс является частью приватного API. Этот класс можно использовать только в репозитории Homebrew/brew. По возможности сторонним разработчикам следует избегать использования этого класса, так как он может быть удалён или изменён без предупреждения.
Файл блокировки, предотвращающий изменение одного и того же пути несколькими процессами Homebrew.
Прямые известные подклассы
Краткое описание атрибутов экземпляра свернуть
- #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. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.
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. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.
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. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.
Этот метод возвращает неопределённое значение.
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. По возможности сторонним разработчикам следует избегать использования этого метода, так как он может быть удалён или изменён без предупреждения.
Этот метод возвращает неопределённое значение.
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