Compare commits

...

1 Commits

Author SHA1 Message Date
Paul Stemmet 42bf29b6f2
src/impl_: add ff unsafe-allow-subinterpreters
Allow the subinterpreter safeguards to be disabled, so that applications
like Ceph's manager can continue to use pyo3 modules without soft
crashing.

Enabling this feature should be done with caution, as any storage of Py
objects in rust statics can lead to undefined behavior.

However, not all consumers of pyo3 use global state, and thus a subset
of them (such as python-bcrypt) are safe to use in subinterpreter
contexts.

References: https://github.com/bazaah/aur-ceph/issues/20
References: https://github.com/PyO3/pyo3/pull/2523
References: https://github.com/pyca/cryptography/issues/9016
References: https://github.com/PyO3/pyo3/discussions/2346#discussioncomment-3246505
References: https://github.com/PyO3/pyo3/discussions/2346#discussioncomment-2911159
References: https://github.com/PyO3/pyo3/issues/3451
Signed-off-by: Paul Stemmet <github@luxolus.com>
2024-07-12 09:55:11 +00:00
2 changed files with 4 additions and 1 deletions

View File

@ -112,6 +112,9 @@ py-clone = []
# Optimizes PyObject to Vec conversion and so on. # Optimizes PyObject to Vec conversion and so on.
nightly = [] nightly = []
# Disables the checks for use in subinterpreters.
unsafe-allow-subinterpreters = []
# Activates all additional features # Activates all additional features
# This is mostly intended for testing purposes - activating *all* of these isn't particularly useful. # This is mostly intended for testing purposes - activating *all* of these isn't particularly useful.
full = [ full = [

View File

@ -107,7 +107,7 @@ impl ModuleDef {
// that static data is not reused across interpreters. // that static data is not reused across interpreters.
// //
// PyPy does not have subinterpreters, so no need to check interpreter ID. // PyPy does not have subinterpreters, so no need to check interpreter ID.
#[cfg(not(any(PyPy, GraalPy)))] #[cfg(not(any(PyPy, GraalPy, feature = "unsafe-allow-subinterpreters")))]
{ {
// PyInterpreterState_Get is only available on 3.9 and later, but is missing // PyInterpreterState_Get is only available on 3.9 and later, but is missing
// from python3.dll for Windows stable API on 3.9 // from python3.dll for Windows stable API on 3.9