1111
1212# ifndef BOOST_PYTHON_MODULE_INIT
1313
14- namespace boost { namespace python { namespace detail {
14+ namespace boost { namespace python {
15+
16+ #ifdef HAS_CXX11
17+ // Use to activate the Py_MOD_GIL_NOT_USED flag.
18+ class mod_gil_not_used {
19+ public:
20+ explicit mod_gil_not_used (bool flag = true ) : flag_(flag) {}
21+ bool flag () const { return flag_; }
22+
23+ private:
24+ bool flag_;
25+ };
26+
27+ namespace detail {
28+
29+ inline bool gil_not_used_option () { return false ; }
30+ template <typename F, typename ... O>
31+ bool gil_not_used_option (F &&, O &&...o);
32+ template <typename ... O>
33+ inline bool gil_not_used_option (mod_gil_not_used f, O &&...o) {
34+ return f.flag () || gil_not_used_option (o...);
35+ }
36+ template <typename F, typename ... O>
37+ inline bool gil_not_used_option (F &&, O &&...o) {
38+ return gil_not_used_option (o...);
39+ }
40+
41+ }
42+ #endif // HAS_CXX11
43+
44+ namespace detail {
1545
1646# if PY_VERSION_HEX >= 0x03000000
1747
18- BOOST_PYTHON_DECL PyObject* init_module (PyModuleDef&, void (*)());
48+ BOOST_PYTHON_DECL PyObject* init_module (PyModuleDef&, void (*)(), bool gil_not_used = false );
1949
2050#else
2151
@@ -27,7 +57,37 @@ BOOST_PYTHON_DECL PyObject* init_module(char const* name, void(*)());
2757
2858# if PY_VERSION_HEX >= 0x03000000
2959
30- # define _BOOST_PYTHON_MODULE_INIT (name ) \
60+ # ifdef HAS_CXX11
61+ # define _BOOST_PYTHON_MODULE_INIT (name, ...) \
62+ PyObject* BOOST_PP_CAT (PyInit_, name)() \
63+ { \
64+ static PyModuleDef_Base initial_m_base = { \
65+ PyObject_HEAD_INIT (NULL ) \
66+ 0 , /* m_init */ \
67+ 0 , /* m_index */ \
68+ 0 /* m_copy */ }; \
69+ static PyMethodDef initial_methods[] = { { 0 , 0 , 0 , 0 } }; \
70+ \
71+ static struct PyModuleDef moduledef = { \
72+ initial_m_base, \
73+ BOOST_PP_STRINGIZE (name), \
74+ 0 , /* m_doc */ \
75+ -1 , /* m_size */ \
76+ initial_methods, \
77+ 0 , /* m_reload */ \
78+ 0 , /* m_traverse */ \
79+ 0 , /* m_clear */ \
80+ 0 , /* m_free */ \
81+ }; \
82+ \
83+ return boost::python::detail::init_module ( \
84+ moduledef, BOOST_PP_CAT (init_module_, name), \
85+ boost::python::detail::gil_not_used_option (__VA_ARGS__) ); \
86+ } \
87+ void BOOST_PP_CAT (init_module_, name)()
88+
89+ # else // !HAS_CXX11
90+ # define _BOOST_PYTHON_MODULE_INIT (name ) \
3191 PyObject* BOOST_PP_CAT (PyInit_, name)() \
3292 { \
3393 static PyModuleDef_Base initial_m_base = { \
@@ -53,6 +113,7 @@ BOOST_PYTHON_DECL PyObject* init_module(char const* name, void(*)());
53113 moduledef, BOOST_PP_CAT (init_module_, name) ); \
54114 } \
55115 void BOOST_PP_CAT (init_module_, name)()
116+ # endif // HAS_CXX11
56117
57118# else
58119
@@ -66,9 +127,15 @@ BOOST_PYTHON_DECL PyObject* init_module(char const* name, void(*)());
66127
67128# endif
68129
69- # define BOOST_PYTHON_MODULE_INIT (name ) \
130+ # ifdef HAS_CXX11
131+ # define BOOST_PYTHON_MODULE_INIT (name, ...) \
132+ void BOOST_PP_CAT (init_module_,name)(); \
133+ extern " C" BOOST_SYMBOL_EXPORT _BOOST_PYTHON_MODULE_INIT (name, __VA_ARGS__)
134+ # else
135+ # define BOOST_PYTHON_MODULE_INIT (name ) \
70136 void BOOST_PP_CAT (init_module_,name)(); \
71137extern " C" BOOST_SYMBOL_EXPORT _BOOST_PYTHON_MODULE_INIT (name)
138+ # endif // HAS_CXX11
72139
73140# endif
74141
0 commit comments