test_gil_scoped.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. /*
  2. tests/test_gil_scoped.cpp -- acquire and release gil
  3. Copyright (c) 2017 Borja Zarco (Google LLC) <bzarco@google.com>
  4. All rights reserved. Use of this source code is governed by a
  5. BSD-style license that can be found in the LICENSE file.
  6. */
  7. #include "pybind11_tests.h"
  8. #include <pybind11/functional.h>
  9. class VirtClass {
  10. public:
  11. virtual ~VirtClass() = default;
  12. VirtClass() = default;
  13. VirtClass(const VirtClass&) = delete;
  14. virtual void virtual_func() {}
  15. virtual void pure_virtual_func() = 0;
  16. };
  17. class PyVirtClass : public VirtClass {
  18. void virtual_func() override {
  19. PYBIND11_OVERRIDE(void, VirtClass, virtual_func,);
  20. }
  21. void pure_virtual_func() override {
  22. PYBIND11_OVERRIDE_PURE(void, VirtClass, pure_virtual_func,);
  23. }
  24. };
  25. TEST_SUBMODULE(gil_scoped, m) {
  26. py::class_<VirtClass, PyVirtClass>(m, "VirtClass")
  27. .def(py::init<>())
  28. .def("virtual_func", &VirtClass::virtual_func)
  29. .def("pure_virtual_func", &VirtClass::pure_virtual_func);
  30. m.def("test_callback_py_obj",
  31. [](py::object func) { func(); });
  32. m.def("test_callback_std_func",
  33. [](const std::function<void()> &func) { func(); });
  34. m.def("test_callback_virtual_func",
  35. [](VirtClass &virt) { virt.virtual_func(); });
  36. m.def("test_callback_pure_virtual_func",
  37. [](VirtClass &virt) { virt.pure_virtual_func(); });
  38. m.def("test_cross_module_gil",
  39. []() {
  40. auto cm = py::module_::import("cross_module_gil_utils");
  41. auto gil_acquire = reinterpret_cast<void (*)()>(
  42. PyLong_AsVoidPtr(cm.attr("gil_acquire_funcaddr").ptr()));
  43. py::gil_scoped_release gil_release;
  44. gil_acquire();
  45. });
  46. }