46 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
		
		
			
		
	
	
			46 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
|  | /*
 | ||
|  |     tests/cross_module_gil_utils.cpp -- tools for acquiring GIL from a different module | ||
|  | 
 | ||
|  |     Copyright (c) 2019 Google LLC | ||
|  | 
 | ||
|  |     All rights reserved. Use of this source code is governed by a | ||
|  |     BSD-style license that can be found in the LICENSE file. | ||
|  | */ | ||
|  | #include <pybind11/pybind11.h>
 | ||
|  | 
 | ||
|  | #include <cstdint>
 | ||
|  | 
 | ||
|  | // 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
 | ||
|  | // py::gil_scoped_acquire when the running thread is in a GIL-released state.
 | ||
|  | //
 | ||
|  | // Note that we define a Python module here for convenience, but in general
 | ||
|  | // this need not be the case. The typical scenario would be a DSO that implements
 | ||
|  | // shared logic used internally by multiple pybind11 modules.
 | ||
|  | 
 | ||
|  | namespace { | ||
|  | 
 | ||
|  | namespace py = pybind11; | ||
|  | void gil_acquire() { py::gil_scoped_acquire gil; } | ||
|  | 
 | ||
|  | constexpr char kModuleName[] = "cross_module_gil_utils"; | ||
|  | 
 | ||
|  | struct PyModuleDef moduledef = { | ||
|  |     PyModuleDef_HEAD_INIT, kModuleName, nullptr, 0, nullptr, nullptr, nullptr, nullptr, nullptr}; | ||
|  | 
 | ||
|  | } // namespace
 | ||
|  | 
 | ||
|  | 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*"); | ||
|  |         PyModule_AddObject( | ||
|  |             m, "gil_acquire_funcaddr", PyLong_FromVoidPtr(reinterpret_cast<void *>(&gil_acquire))); | ||
|  |     } | ||
|  | 
 | ||
|  |     return m; | ||
|  | } |