test_gil_scoped.cpp revision 14299
114299Sbbruce@ucdavis.edu/* 214299Sbbruce@ucdavis.edu tests/test_gil_scoped.cpp -- acquire and release gil 314299Sbbruce@ucdavis.edu 414299Sbbruce@ucdavis.edu Copyright (c) 2017 Borja Zarco (Google LLC) <bzarco@google.com> 514299Sbbruce@ucdavis.edu 614299Sbbruce@ucdavis.edu All rights reserved. Use of this source code is governed by a 714299Sbbruce@ucdavis.edu BSD-style license that can be found in the LICENSE file. 814299Sbbruce@ucdavis.edu*/ 914299Sbbruce@ucdavis.edu 1014299Sbbruce@ucdavis.edu#include "pybind11_tests.h" 1114299Sbbruce@ucdavis.edu#include <pybind11/functional.h> 1214299Sbbruce@ucdavis.edu 1314299Sbbruce@ucdavis.edu 1414299Sbbruce@ucdavis.educlass VirtClass { 1514299Sbbruce@ucdavis.edupublic: 1614299Sbbruce@ucdavis.edu virtual ~VirtClass() {} 1714299Sbbruce@ucdavis.edu virtual void virtual_func() {} 1814299Sbbruce@ucdavis.edu virtual void pure_virtual_func() = 0; 1914299Sbbruce@ucdavis.edu}; 2014299Sbbruce@ucdavis.edu 2114299Sbbruce@ucdavis.educlass PyVirtClass : public VirtClass { 2214299Sbbruce@ucdavis.edu void virtual_func() override { 2314299Sbbruce@ucdavis.edu PYBIND11_OVERLOAD(void, VirtClass, virtual_func,); 2414299Sbbruce@ucdavis.edu } 2514299Sbbruce@ucdavis.edu void pure_virtual_func() override { 2614299Sbbruce@ucdavis.edu PYBIND11_OVERLOAD_PURE(void, VirtClass, pure_virtual_func,); 2714299Sbbruce@ucdavis.edu } 2814299Sbbruce@ucdavis.edu}; 2914299Sbbruce@ucdavis.edu 3014299Sbbruce@ucdavis.eduTEST_SUBMODULE(gil_scoped, m) { 3114299Sbbruce@ucdavis.edu py::class_<VirtClass, PyVirtClass>(m, "VirtClass") 3214299Sbbruce@ucdavis.edu .def(py::init<>()) 3314299Sbbruce@ucdavis.edu .def("virtual_func", &VirtClass::virtual_func) 3414299Sbbruce@ucdavis.edu .def("pure_virtual_func", &VirtClass::pure_virtual_func); 3514299Sbbruce@ucdavis.edu 3614299Sbbruce@ucdavis.edu m.def("test_callback_py_obj", 3714299Sbbruce@ucdavis.edu [](py::object func) { func(); }); 3814299Sbbruce@ucdavis.edu m.def("test_callback_std_func", 3914299Sbbruce@ucdavis.edu [](const std::function<void()> &func) { func(); }); 4014299Sbbruce@ucdavis.edu m.def("test_callback_virtual_func", 4114299Sbbruce@ucdavis.edu [](VirtClass &virt) { virt.virtual_func(); }); 4214299Sbbruce@ucdavis.edu m.def("test_callback_pure_virtual_func", 4314299Sbbruce@ucdavis.edu [](VirtClass &virt) { virt.pure_virtual_func(); }); 4414299Sbbruce@ucdavis.edu m.def("test_cross_module_gil", 4514299Sbbruce@ucdavis.edu []() { 4614299Sbbruce@ucdavis.edu auto cm = py::module::import("cross_module_gil_utils"); 4714299Sbbruce@ucdavis.edu auto gil_acquire = reinterpret_cast<void (*)()>( 4814299Sbbruce@ucdavis.edu PyLong_AsVoidPtr(cm.attr("gil_acquire_funcaddr").ptr())); 4914299Sbbruce@ucdavis.edu py::gil_scoped_release gil_release; 5014299Sbbruce@ucdavis.edu gil_acquire(); 5114299Sbbruce@ucdavis.edu }); 5214299Sbbruce@ucdavis.edu} 53