diff options
author | Dan Willemsen <dwillemsen@google.com> | 2023-08-23 23:12:47 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-08-23 23:12:47 +0000 |
commit | 54f25be124181b5b5e37d686ae78a2ef43f77594 (patch) | |
tree | a199f13004f9dca173b6bc46161736ffc224f6fc /tests/cross_module_gil_utils.cpp | |
parent | 0d8c94d2775dd2629be4247df9847de23c073490 (diff) | |
parent | eba01819262de24db698eeb259f488ba2b1e89e6 (diff) | |
download | pybind11-54f25be124181b5b5e37d686ae78a2ef43f77594.tar.gz |
Upgrade pybind11 to v2.11.0 am: df375684ae am: c3651ffda2 am: b8f469b116 am: ce45d68f7a am: eba0181926HEADandroid-14.0.0_r50mastermainandroid14-qpr3-release
Original change: https://android-review.googlesource.com/c/platform/external/python/pybind11/+/2722853
Change-Id: Iac83f632be76c6ead72145c9705e5af0233309ac
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'tests/cross_module_gil_utils.cpp')
-rw-r--r-- | tests/cross_module_gil_utils.cpp | 111 |
1 files changed, 73 insertions, 38 deletions
diff --git a/tests/cross_module_gil_utils.cpp b/tests/cross_module_gil_utils.cpp index 07db9f6e..7c20849d 100644 --- a/tests/cross_module_gil_utils.cpp +++ b/tests/cross_module_gil_utils.cpp @@ -6,8 +6,15 @@ All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. */ +#if defined(PYBIND11_INTERNALS_VERSION) +# undef PYBIND11_INTERNALS_VERSION +#endif +#define PYBIND11_INTERNALS_VERSION 21814642 // Ensure this module has its own `internals` instance. #include <pybind11/pybind11.h> + #include <cstdint> +#include <string> +#include <thread> // This file mimics a DSO that makes pybind11 calls but does not define a // PYBIND11_MODULE. The purpose is to test that such a DSO can create a @@ -20,54 +27,82 @@ namespace { namespace py = pybind11; + void gil_acquire() { py::gil_scoped_acquire gil; } -constexpr char kModuleName[] = "cross_module_gil_utils"; +std::string gil_multi_acquire_release(unsigned bits) { + if ((bits & 0x1u) != 0u) { + py::gil_scoped_acquire gil; + } + if ((bits & 0x2u) != 0u) { + py::gil_scoped_release gil; + } + if ((bits & 0x4u) != 0u) { + py::gil_scoped_acquire gil; + } + if ((bits & 0x8u) != 0u) { + py::gil_scoped_release gil; + } + return PYBIND11_INTERNALS_ID; +} -#if PY_MAJOR_VERSION >= 3 -struct PyModuleDef moduledef = { - PyModuleDef_HEAD_INIT, - kModuleName, - NULL, - 0, - NULL, - NULL, - NULL, - NULL, - NULL +struct CustomAutoGIL { + CustomAutoGIL() : gstate(PyGILState_Ensure()) {} + ~CustomAutoGIL() { PyGILState_Release(gstate); } + + PyGILState_STATE gstate; }; -#else -PyMethodDef module_methods[] = { - {NULL, NULL, 0, NULL} +struct CustomAutoNoGIL { + CustomAutoNoGIL() : save(PyEval_SaveThread()) {} + ~CustomAutoNoGIL() { PyEval_RestoreThread(save); } + + PyThreadState *save; }; -#endif -} // namespace +template <typename Acquire, typename Release> +void gil_acquire_inner() { + Acquire acquire_outer; + Acquire acquire_inner; + Release release; +} -extern "C" PYBIND11_EXPORT -#if PY_MAJOR_VERSION >= 3 -PyObject* PyInit_cross_module_gil_utils() -#else -void initcross_module_gil_utils() -#endif -{ +template <typename Acquire, typename Release> +void gil_acquire_nested() { + Acquire acquire_outer; + Acquire acquire_inner; + Release release; + auto thread = std::thread(&gil_acquire_inner<Acquire, Release>); + thread.join(); +} - PyObject* m = -#if PY_MAJOR_VERSION >= 3 - PyModule_Create(&moduledef); -#else - Py_InitModule(kModuleName, module_methods); -#endif +constexpr char kModuleName[] = "cross_module_gil_utils"; + +struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, kModuleName, nullptr, 0, nullptr, nullptr, nullptr, nullptr, nullptr}; + +} // namespace + +#define ADD_FUNCTION(Name, ...) \ + PyModule_AddObject(m, Name, PyLong_FromVoidPtr(reinterpret_cast<void *>(&__VA_ARGS__))); - if (m != NULL) { - static_assert( - sizeof(&gil_acquire) == sizeof(void*), - "Function pointer must have the same size as void*"); - PyModule_AddObject(m, "gil_acquire_funcaddr", - PyLong_FromVoidPtr(reinterpret_cast<void*>(&gil_acquire))); +extern "C" PYBIND11_EXPORT PyObject *PyInit_cross_module_gil_utils() { + + PyObject *m = PyModule_Create(&moduledef); + + if (m != nullptr) { + static_assert(sizeof(&gil_acquire) == sizeof(void *), + "Function pointer must have the same size as void*"); + ADD_FUNCTION("gil_acquire_funcaddr", gil_acquire) + ADD_FUNCTION("gil_multi_acquire_release_funcaddr", gil_multi_acquire_release) + ADD_FUNCTION("gil_acquire_inner_custom_funcaddr", + gil_acquire_inner<CustomAutoGIL, CustomAutoNoGIL>) + ADD_FUNCTION("gil_acquire_nested_custom_funcaddr", + gil_acquire_nested<CustomAutoGIL, CustomAutoNoGIL>) + ADD_FUNCTION("gil_acquire_inner_pybind11_funcaddr", + gil_acquire_inner<py::gil_scoped_acquire, py::gil_scoped_release>) + ADD_FUNCTION("gil_acquire_nested_pybind11_funcaddr", + gil_acquire_nested<py::gil_scoped_acquire, py::gil_scoped_release>) } -#if PY_MAJOR_VERSION >= 3 return m; -#endif } |