mirror of
https://github.com/pybind/pybind11.git
synced 2026-03-14 20:27:47 +00:00
* Add failback implementation of `PyCriticalSection_BeginMutex` for Python 3.13t * Add comment for Python version * Use `_PyCriticalSection_BeginSlow` * Add forward declaration * Fix forward declaration * Remove always true condition `defined(PY_VERSION_HEX)` * Detect musllinux * Add manylinux test * Use direct mutex locking for Python 3.13t `_PyCriticalSection_BeginSlow` is a private CPython function not exported on Linux. For Python < 3.14.0rc1, use direct `mutex.lock()`/`mutex.unlock()` instead of critical section APIs. * Empty commit to trigger CI * Empty commit to trigger CI * Empty commit to trigger CI * Run apt update before apt install * Remove unnecessary prefix * Add manylinux test with Python 3.13t * Simplify pycritical_section with std::unique_lock fallback for Python < 3.14 * Fix potential deadlock in make_iterator_impl for Python 3.13t Refactor pycritical_section into a unified class with internal version checks instead of using a type alias fallback. Skip locking in make_iterator_impl for Python < 3.14.0rc1 to avoid deadlock during type registration, as pycritical_section cannot release the mutex during Python callbacks without PyCriticalSection_BeginMutex. * Add reference for xfail message
72 lines
2.1 KiB
Python
72 lines
2.1 KiB
Python
from __future__ import annotations
|
|
|
|
import platform
|
|
import sys
|
|
import sysconfig
|
|
|
|
ANDROID = sys.platform.startswith("android")
|
|
IOS = sys.platform.startswith("ios")
|
|
LINUX = sys.platform.startswith("linux")
|
|
MACOS = sys.platform.startswith("darwin")
|
|
WIN = sys.platform.startswith("win32") or sys.platform.startswith("cygwin")
|
|
FREEBSD = sys.platform.startswith("freebsd")
|
|
|
|
MUSLLINUX = False
|
|
MANYLINUX = False
|
|
if LINUX:
|
|
|
|
def _is_musl() -> bool:
|
|
libc, _ = platform.libc_ver()
|
|
return libc == "musl" or (libc != "glibc" and libc != "")
|
|
|
|
MUSLLINUX = _is_musl()
|
|
MANYLINUX = not MUSLLINUX
|
|
del _is_musl
|
|
|
|
CPYTHON = platform.python_implementation() == "CPython"
|
|
PYPY = platform.python_implementation() == "PyPy"
|
|
GRAALPY = sys.implementation.name == "graalpy"
|
|
_graalpy_version = (
|
|
sys.modules["__graalpython__"].get_graalvm_version() if GRAALPY else "0.0.0"
|
|
)
|
|
GRAALPY_VERSION = tuple(int(t) for t in _graalpy_version.split("-")[0].split(".")[:3])
|
|
|
|
# Compile-time config (what the binary was built for)
|
|
PY_GIL_DISABLED = bool(sysconfig.get_config_var("Py_GIL_DISABLED"))
|
|
# Runtime state (what's actually happening now)
|
|
sys_is_gil_enabled = getattr(sys, "_is_gil_enabled", lambda: True)
|
|
|
|
TYPES_ARE_IMMORTAL = (
|
|
PYPY
|
|
or GRAALPY
|
|
or (CPYTHON and PY_GIL_DISABLED and (3, 13) <= sys.version_info < (3, 14))
|
|
)
|
|
|
|
|
|
def check_script_success_in_subprocess(code: str, *, rerun: int = 8) -> None:
|
|
"""Runs the given code in a subprocess."""
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
import textwrap
|
|
|
|
code = textwrap.dedent(code).strip()
|
|
try:
|
|
for _ in range(rerun): # run flakily failing test multiple times
|
|
subprocess.check_output(
|
|
[sys.executable, "-c", code],
|
|
cwd=os.getcwd(),
|
|
stderr=subprocess.STDOUT,
|
|
text=True,
|
|
)
|
|
except subprocess.CalledProcessError as ex:
|
|
raise RuntimeError(
|
|
f"Subprocess failed with exit code {ex.returncode}.\n\n"
|
|
f"Code:\n"
|
|
f"```python\n"
|
|
f"{code}\n"
|
|
f"```\n\n"
|
|
f"Output:\n"
|
|
f"{ex.output}"
|
|
) from None
|