Fix TSan warning in sub-interpreter test (#5729)

This commit is contained in:
b-pass
2025-06-17 23:50:30 -04:00
committed by GitHub
parent ad9180c120
commit f2c0ab83bc
2 changed files with 17 additions and 4 deletions

View File

@@ -521,8 +521,11 @@ public:
/// Drop all the references we're currently holding.
void unref() {
#ifdef PYBIND11_HAS_SUBINTERPRETER_SUPPORT
last_istate_.reset();
internals_tls_p_.reset();
if (get_num_interpreters_seen() > 1) {
last_istate_.reset();
internals_tls_p_.reset();
return;
}
#endif
internals_singleton_pp_ = nullptr;
}

View File

@@ -20,11 +20,21 @@ bool has_state_dict_internals_obj();
uintptr_t get_details_as_uintptr();
void unsafe_reset_internals_for_single_interpreter() {
// unsafe normally, but for subsequent tests, put this back.. we know there are no threads
// running and only 1 interpreter
// NOTE: This code is NOT SAFE unless the caller guarantees no other threads are alive
// NOTE: This code is tied to the precise implementation of the internals holder
// first, unref the thread local internals
py::detail::get_internals_pp_manager().unref();
py::detail::get_local_internals_pp_manager().unref();
// we know there are no other interpreters, so we can lower this. SUPER DANGEROUS
py::detail::get_num_interpreters_seen() = 1;
// now we unref the static global singleton internals
py::detail::get_internals_pp_manager().unref();
py::detail::get_local_internals_pp_manager().unref();
// finally, we reload the static global singleton
py::detail::get_internals();
py::detail::get_local_internals();
}