diff --git a/newsfragments/3502.added.md b/newsfragments/3502.added.md new file mode 100644 index 00000000..12109174 --- /dev/null +++ b/newsfragments/3502.added.md @@ -0,0 +1 @@ +Added the `PyInterpreterConfig` struct, its constants and `Py_NewInterpreterFromConfig`. \ No newline at end of file diff --git a/pyo3-ffi/src/cpython/pylifecycle.rs b/pyo3-ffi/src/cpython/pylifecycle.rs index 08c47881..c259c369 100644 --- a/pyo3-ffi/src/cpython/pylifecycle.rs +++ b/pyo3-ffi/src/cpython/pylifecycle.rs @@ -44,5 +44,56 @@ extern "C" { // skipped _Py_LegacyLocaleDetected // skipped _Py_SetLocaleFromEnv - // skipped _Py_NewInterpreter } + +#[cfg(Py_3_12)] +pub const PyInterpreterConfig_DEFAULT_GIL: c_int = 0; +#[cfg(Py_3_12)] +pub const PyInterpreterConfig_SHARED_GIL: c_int = 1; +#[cfg(Py_3_12)] +pub const PyInterpreterConfig_OWN_GIL: c_int = 2; + +#[cfg(Py_3_12)] +#[repr(C)] +pub struct PyInterpreterConfig { + pub use_main_obmalloc: c_int, + pub allow_fork: c_int, + pub allow_exec: c_int, + pub allow_threads: c_int, + pub allow_daemon_threads: c_int, + pub check_multi_interp_extensions: c_int, + pub gil: c_int, +} + +#[cfg(Py_3_12)] +pub const _PyInterpreterConfig_INIT: PyInterpreterConfig = PyInterpreterConfig { + use_main_obmalloc: 0, + allow_fork: 0, + allow_exec: 0, + allow_threads: 1, + allow_daemon_threads: 0, + check_multi_interp_extensions: 1, + gil: PyInterpreterConfig_OWN_GIL, +}; + +#[cfg(Py_3_12)] +pub const _PyInterpreterConfig_LEGACY_INIT: PyInterpreterConfig = PyInterpreterConfig { + use_main_obmalloc: 1, + allow_fork: 1, + allow_exec: 1, + allow_threads: 1, + allow_daemon_threads: 1, + check_multi_interp_extensions: 0, + gil: PyInterpreterConfig_SHARED_GIL, +}; + +extern "C" { + #[cfg(Py_3_12)] + pub fn Py_NewInterpreterFromConfig( + tstate_p: *mut *mut crate::PyThreadState, + config: *const PyInterpreterConfig, + ) -> PyStatus; +} + +// skipped atexit_datacallbackfunc +// skipped _Py_AtExit