mirror of https://github.com/pybind/pybind11
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.7 KiB
64 lines
1.7 KiB
/* |
|
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"; |
|
|
|
#if PY_MAJOR_VERSION >= 3 |
|
struct PyModuleDef moduledef |
|
= {PyModuleDef_HEAD_INIT, kModuleName, NULL, 0, NULL, NULL, NULL, NULL, NULL}; |
|
#else |
|
PyMethodDef module_methods[] = {{NULL, NULL, 0, NULL}}; |
|
#endif |
|
|
|
} // namespace |
|
|
|
extern "C" PYBIND11_EXPORT |
|
#if PY_MAJOR_VERSION >= 3 |
|
PyObject * |
|
PyInit_cross_module_gil_utils() |
|
#else |
|
void |
|
initcross_module_gil_utils() |
|
#endif |
|
{ |
|
|
|
PyObject *m = |
|
#if PY_MAJOR_VERSION >= 3 |
|
PyModule_Create(&moduledef); |
|
#else |
|
Py_InitModule(kModuleName, module_methods); |
|
#endif |
|
|
|
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))); |
|
} |
|
|
|
#if PY_MAJOR_VERSION >= 3 |
|
return m; |
|
#endif |
|
}
|
|
|