Ticket #7836: gil.hpp

File gil.hpp, 1.6 KB (added by John Zwinck <jzwinck@…>, 10 years ago)

Header file proposed for <boost/python/gil.hpp>

Line 
1// Copyright John Zwinck 2012.
2// Distributed under the Boost Software License, Version 1.0. (See
3// accompanying file LICENSE_1_0.txt or copy at
4// http://www.boost.org/LICENSE_1_0.txt)
5#ifndef BOOST_PYTHON_GIL_JZ201212_HPP
6# define BOOST_PYTHON_GIL_JZ201212_HPP
7
8# include <boost/python/detail/prefix.hpp>
9# include <boost/noncopyable.hpp>
10
11namespace boost { namespace python {
12
13 // When a C++ function is called by Python and it will be long-running,
14 // it should release the Global Interpreter Lock (GIL) by constructing one of these.
15 // This does not mean the C++ function needs to do this when invoked directly from C++:
16 // it should instead have a wrapper that sits in front of its Python binding, like this:
17 //
18 // void MyClass::longRunningFunction(); // native C++ code
19 //
20 // void myWrapper(MyClass& my) // local function in Python bindings module
21 // {
22 // gil_guard_release guard;
23 // my.longRunningFunction();
24 // }
25 //
26 // // within BOOST_PYTHON_MODULE():
27 // class_<MyClass>("MyClass")
28 // .def("longRunningFunction", myWrapper);
29 //
30 // See http://wiki.python.org/moin/boost.python/HowTo#Multithreading_Support_for_my_function
31 class gil_guard_release
32 : boost::noncopyable
33 {
34 public:
35 gil_guard_release();
36 ~gil_guard_release();
37
38 private:
39 bool m_do_acquire;
40 };
41
42 class gil_guard_acquire
43 : boost::noncopyable
44 {
45 public:
46 gil_guard_acquire();
47 ~gil_guard_acquire();
48
49 private:
50 PyThreadState* m_thread_state;
51 };
52
53}} // namespace boost::python
54
55#endif // BOOST_PYTHON_GIL_JZ201212_HPP