mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 22:13:26 +00:00
Fixes #2665. Regenerated by tabbott with `lint --fix` after a rebase and change in parameters. Note from tabbott: In a few cases, this converts technical debt in the form of unsorted imports into different technical debt in the form of our largest files having very long, ugly import sequences at the start. I expect this change will increase pressure for us to split those files, which isn't a bad thing. Signed-off-by: Anders Kaseorg <anders@zulip.com>
31 lines
972 B
Python
31 lines
972 B
Python
"""
|
|
Context managers, i.e. things you can use with the 'with' statement.
|
|
"""
|
|
import fcntl
|
|
from contextlib import contextmanager
|
|
from typing import IO, Any, Iterator, Union
|
|
|
|
|
|
@contextmanager
|
|
def flock(lockfile: Union[int, IO[Any]], shared: bool=False) -> Iterator[None]:
|
|
"""Lock a file object using flock(2) for the duration of a 'with' statement.
|
|
|
|
If shared is True, use a LOCK_SH lock, otherwise LOCK_EX."""
|
|
|
|
fcntl.flock(lockfile, fcntl.LOCK_SH if shared else fcntl.LOCK_EX)
|
|
try:
|
|
yield
|
|
finally:
|
|
fcntl.flock(lockfile, fcntl.LOCK_UN)
|
|
|
|
@contextmanager
|
|
def lockfile(filename: str, shared: bool=False) -> Iterator[None]:
|
|
"""Lock a file using flock(2) for the duration of a 'with' statement.
|
|
|
|
If shared is True, use a LOCK_SH lock, otherwise LOCK_EX.
|
|
|
|
The file is given by name and will be created if it does not exist."""
|
|
with open(filename, 'w') as lock:
|
|
with flock(lock, shared=shared):
|
|
yield
|