mirror of
https://github.com/pybind/pybind11.git
synced 2026-04-19 14:29:11 +00:00
* Allow per-interpreter internals/local_internals * Significant rewrite to avoid using thread_locals as much as possible. Since we can avoid them by checking this atomic, the cmake config conditional shouldn't be necessary. The slower path (with thread_locals and extra checks) only comes in when a second interpreter is actually instanciated. * Add a test for per-interpreter GIL Uses two extra threads to demonstrate that neither shares a GIL. * Fix for nonconforming std::atomic constructors on some compilers * style: pre-commit fixes * Fix initializer to make MSVC happy. * Switch to gil_scoped_acquire_simple, get rid of old copy of it from internals.h * Use the PyThreadState's interp member rather than the thread state itself. * Be more explicit about the type of the internalspp * Suggested renamings and rewordings * Rename find_internals_pp and change it to take in the state dict reference * Use the old raise_from instead of pybind11_fail * Move most of the internals initialization into its constructor. * Move round_up_to_next_pow2 function upwards * Remove redundant forward decl * Add a python-driven subinterpreter test * Disable the python subinterpreter test on emscripten Can't load the native-built cpp modules. * Switch the internals pointer pointer to a unique_ptr pointer * Spelling * Fix clang-tidy warning, compare pointer to nullptr * Rename get_interpreter_counter to get_num_interpreters_seen * Try simplifying the test's cmake set_target_properties * Replace mod_* tags with a single tag w/enum Update tests accordingly * Add a test for shared-GIL (legacy) subinterpreters * Update test to work around differences in the various versions of interpreters modules * Fix unused parameter * Rename tests and associated test modules. * Switch get_internals_pp to a template function * Rename curtstate to cur_tstate * refactor: use simpler names Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com> * style: pre-commit fixes * fix: return class, not enum Co-authored-by: Ralf W. Grosse-Kunstleve <rwgkio@gmail.com> Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com> * Have to join these threads to make sure they are totally done before the test returns. * Wrap module_def initialization in a static so it only happens once. If it happens concurrently in multiple threads, badness ensues.... * style: pre-commit fixes --------- Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Henry Schreiner <henryschreineriii@gmail.com> Co-authored-by: Ralf W. Grosse-Kunstleve <rwgkio@gmail.com>
25 lines
666 B
C++
25 lines
666 B
C++
#include <pybind11/pybind11.h>
|
|
|
|
namespace py = pybind11;
|
|
|
|
/* Simple test module/test class to check that the referenced internals data of external pybind11
|
|
* modules aren't preserved over a finalize/initialize.
|
|
*/
|
|
|
|
PYBIND11_MODULE(external_module,
|
|
m,
|
|
py::mod_gil_not_used(),
|
|
py::multiple_interpreters::per_interpreter_gil()) {
|
|
|
|
class A {
|
|
public:
|
|
explicit A(int value) : v{value} {};
|
|
int v;
|
|
};
|
|
|
|
py::class_<A>(m, "A").def(py::init<int>()).def_readwrite("value", &A::v);
|
|
|
|
m.def("internals_at",
|
|
[]() { return reinterpret_cast<uintptr_t>(&py::detail::get_internals()); });
|
|
}
|