aboutsummaryrefslogtreecommitdiff
path: root/tests/cross_module_gil_utils.cpp
diff options
context:
space:
mode:
authorDan Willemsen <dwillemsen@google.com>2023-08-23 23:12:47 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-08-23 23:12:47 +0000
commit54f25be124181b5b5e37d686ae78a2ef43f77594 (patch)
treea199f13004f9dca173b6bc46161736ffc224f6fc /tests/cross_module_gil_utils.cpp
parent0d8c94d2775dd2629be4247df9847de23c073490 (diff)
parenteba01819262de24db698eeb259f488ba2b1e89e6 (diff)
downloadpybind11-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.cpp111
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
}