mirror of
https://github.com/pypa/pip
synced 2023-12-13 21:30:23 +01:00
54 lines
1.6 KiB
Python
54 lines
1.6 KiB
Python
# mypy: no-warn-unused-ignores
|
|
|
|
import contextlib
|
|
import signal
|
|
from typing import Iterable, Iterator
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def nullcontext() -> Iterator[None]:
|
|
"""
|
|
Context manager that does no additional processing.
|
|
|
|
Used as a stand-in for a normal context manager, when a particular block of
|
|
code is only sometimes used with a normal context manager:
|
|
|
|
cm = optional_cm if condition else nullcontext()
|
|
with cm:
|
|
# Perform operation, using optional_cm if condition is True
|
|
|
|
TODO: Replace with contextlib.nullcontext after dropping Python 3.6
|
|
support.
|
|
"""
|
|
yield
|
|
|
|
|
|
# Applies on Windows.
|
|
if not hasattr(signal, "pthread_sigmask"):
|
|
# We're not relying on this behavior anywhere currently, it's just best
|
|
# practice.
|
|
blocked_signals = nullcontext
|
|
else:
|
|
|
|
@contextlib.contextmanager
|
|
def blocked_signals() -> Iterator[None]:
|
|
"""Block all signals for e.g. starting a worker thread."""
|
|
# valid_signals() was added in Python 3.8 (and not using it results
|
|
# in a warning on pthread_sigmask() call)
|
|
mask: Iterable[int]
|
|
try:
|
|
mask = signal.valid_signals()
|
|
except AttributeError:
|
|
mask = set(range(1, signal.NSIG))
|
|
|
|
old_mask = signal.pthread_sigmask( # type: ignore[attr-defined]
|
|
signal.SIG_SETMASK, # type: ignore[attr-defined]
|
|
mask,
|
|
)
|
|
try:
|
|
yield
|
|
finally:
|
|
signal.pthread_sigmask( # type: ignore[attr-defined]
|
|
signal.SIG_SETMASK, # type: ignore[attr-defined]
|
|
old_mask,
|
|
)
|