From febccbf6e77cbda5290d45cabfb8483ee5c2acf2 Mon Sep 17 00:00:00 2001 From: Mara Bos Date: Sat, 23 May 2020 21:58:46 +0200 Subject: [PATCH] Call Py_Finalize at exit using libc::atexit. This makes sure buffers are flushed, threads are joined, etc. when exiting the process. --- CHANGELOG.md | 1 + src/gil.rs | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18e61e2cdc6..39086421190 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Changed - Simplify internals of `#[pyo3(get)]` attribute. (Remove the hidden API `GetPropertyValue`.) [#934](https://github.com/PyO3/pyo3/pull/934) +- Call `Py_Finalize` at exit to flush buffers, etc. [#943](https://github.com/PyO3/pyo3/pull/943) ### Removed - Remove `ManagedPyRef` (unused, and needs specialization) [#930](https://github.com/PyO3/pyo3/pull/930) diff --git a/src/gil.rs b/src/gil.rs index 7c333da2e5c..ec3666e8512 100644 --- a/src/gil.rs +++ b/src/gil.rs @@ -83,7 +83,12 @@ pub fn prepare_freethreaded_python() { // PyPy does not support the embedding API #[cfg(not(PyPy))] - ffi::Py_InitializeEx(0); + { + ffi::Py_InitializeEx(0); + + // Make sure Py_Finalize will be called before exiting. + libc::atexit(finalize); + } // > Changed in version 3.7: This function is now called by Py_Initialize(), so you don’t have // > to call it yourself anymore. @@ -356,6 +361,15 @@ fn decrement_gil_count() { }) } +extern "C" fn finalize() { + unsafe { + if ffi::Py_IsInitialized() != 0 { + ffi::PyGILState_Ensure(); + ffi::Py_Finalize(); + } + } +} + #[cfg(test)] mod test { use super::{gil_is_acquired, GILPool, GIL_COUNT, OWNED_OBJECTS, POOL};