From a29a5918c326c47a9787ee076e0a77594b91e434 Mon Sep 17 00:00:00 2001 From: Aaron Gokaslan Date: Thu, 2 Feb 2023 13:16:28 -0500 Subject: [PATCH 1/2] Keep registered types until after Py_Finalize(). Fix #4459 --- include/pybind11/embed.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/include/pybind11/embed.h b/include/pybind11/embed.h index 5a175b1341..e3d357e16a 100644 --- a/include/pybind11/embed.h +++ b/include/pybind11/embed.h @@ -254,13 +254,15 @@ inline void finalize_interpreter() { if (builtins.contains(id) && isinstance(builtins[id])) { internals_ptr_ptr = capsule(builtins[id]); } + + Py_Finalize(); + // Local internals contains data managed by the current interpreter, so we must clear them to // avoid undefined behaviors when initializing another interpreter + // Must be cleared after Py_Finalize() so atexit and other hooks can use registered_types detail::get_local_internals().registered_types_cpp.clear(); detail::get_local_internals().registered_exception_translators.clear(); - Py_Finalize(); - if (internals_ptr_ptr) { delete *internals_ptr_ptr; *internals_ptr_ptr = nullptr; From 7eb618c164385bf25053933a27a6dfe39191dafd Mon Sep 17 00:00:00 2001 From: Aaron Gokaslan Date: Thu, 2 Feb 2023 17:57:05 -0500 Subject: [PATCH 2/2] Address reviewer comments --- include/pybind11/embed.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/pybind11/embed.h b/include/pybind11/embed.h index e3d357e16a..8450d53589 100644 --- a/include/pybind11/embed.h +++ b/include/pybind11/embed.h @@ -259,7 +259,8 @@ inline void finalize_interpreter() { // Local internals contains data managed by the current interpreter, so we must clear them to // avoid undefined behaviors when initializing another interpreter - // Must be cleared after Py_Finalize() so atexit and other hooks can use registered_types + // Must be cleared only after Py_Finalize() so atexit and other hooks can still use + // registered_types detail::get_local_internals().registered_types_cpp.clear(); detail::get_local_internals().registered_exception_translators.clear();