Browse Source

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

pull/5734/head
b-pass 3 weeks ago committed by GitHub
parent
commit
f2c0ab83bc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 7
      include/pybind11/detail/internals.h
  2. 14
      tests/test_embed/test_subinterpreter.cpp

7
include/pybind11/detail/internals.h

@ -521,8 +521,11 @@ public: @@ -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;
}

14
tests/test_embed/test_subinterpreter.cpp

@ -20,11 +20,21 @@ bool has_state_dict_internals_obj(); @@ -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();
}

Loading…
Cancel
Save