Skip to content

Commit 417b569

Browse files
committed
CheckedGILRelease: A scope class to release the GIL if the current thread holds it.
Some application may have code being run with or without holding the GIL beyond our control, so we need a class to release the GIL in case the current thread is holding it. This is useful in the context of Caribou like applications.
1 parent 1dfcee0 commit 417b569

File tree

2 files changed

+125
-0
lines changed

2 files changed

+125
-0
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
//////////////////////////////////////////////////////////////////////////
2+
//
3+
// Copyright (c) 2023, Image Engine Design Inc. All rights reserved.
4+
//
5+
// Redistribution and use in source and binary forms, with or without
6+
// modification, are permitted provided that the following conditions are
7+
// met:
8+
//
9+
// * Redistributions of source code must retain the above copyright
10+
// notice, this list of conditions and the following disclaimer.
11+
//
12+
// * Redistributions in binary form must reproduce the above copyright
13+
// notice, this list of conditions and the following disclaimer in the
14+
// documentation and/or other materials provided with the distribution.
15+
//
16+
// * Neither the name of Image Engine Design nor the names of any
17+
// other contributors to this software may be used to endorse or
18+
// promote products derived from this software without specific prior
19+
// written permission.
20+
//
21+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
22+
// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
23+
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24+
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
25+
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26+
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27+
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28+
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29+
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30+
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31+
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32+
//
33+
//////////////////////////////////////////////////////////////////////////
34+
35+
#ifndef IECOREPYTHON_CHECKEDGILRELEASE_H
36+
#define IECOREPYTHON_CHECKEDGILRELEASE_H
37+
38+
#include "boost/python.hpp"
39+
40+
#include "IECorePython/Export.h"
41+
42+
namespace IECorePython
43+
{
44+
45+
/// This class checks if we hold the GIL and if we do releases the GIL upon construction and reacquires it
46+
/// upon destruction, otherwise it's a no op. It should be used in bindings to C++ functions
47+
/// which may take a while to return - for instance heavy computations
48+
/// or IO.
49+
class IECOREPYTHON_API CheckedGILRelease : boost::noncopyable
50+
{
51+
52+
public :
53+
54+
CheckedGILRelease();
55+
~CheckedGILRelease();
56+
57+
private :
58+
59+
bool m_gilThreadsInitialised;
60+
PyThreadState *m_state;
61+
62+
};
63+
64+
} // namespace IECorePython
65+
66+
#endif // IECOREPYTHON_CHECKEDGILRELEASE_H
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//////////////////////////////////////////////////////////////////////////
2+
//
3+
// Copyright (c) 2023, Image Engine Design Inc. All rights reserved.
4+
//
5+
// Redistribution and use in source and binary forms, with or without
6+
// modification, are permitted provided that the following conditions are
7+
// met:
8+
//
9+
// * Redistributions of source code must retain the above copyright
10+
// notice, this list of conditions and the following disclaimer.
11+
//
12+
// * Redistributions in binary form must reproduce the above copyright
13+
// notice, this list of conditions and the following disclaimer in the
14+
// documentation and/or other materials provided with the distribution.
15+
//
16+
// * Neither the name of Image Engine Design nor the names of any
17+
// other contributors to this software may be used to endorse or
18+
// promote products derived from this software without specific prior
19+
// written permission.
20+
//
21+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
22+
// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
23+
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24+
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
25+
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26+
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27+
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28+
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29+
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30+
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31+
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32+
//
33+
//////////////////////////////////////////////////////////////////////////
34+
35+
#include "IECorePython/CheckedGILRelease.h"
36+
37+
using namespace IECorePython;
38+
39+
CheckedGILRelease::CheckedGILRelease()
40+
#if PY_VERSION_HEX >= 0x03090000
41+
: m_gilThreadsInitialised( Py_IsInitialized() && PyGILState_Check() )
42+
#else
43+
: m_gilThreadsInitialised( Py_IsInitialized() && PyEval_ThreadsInitialized() && PyGILState_Check() )
44+
#endif
45+
{
46+
if( m_gilThreadsInitialised )
47+
{
48+
m_state = PyEval_SaveThread();
49+
}
50+
}
51+
52+
CheckedGILRelease::~CheckedGILRelease()
53+
{
54+
if( m_gilThreadsInitialised )
55+
{
56+
PyEval_RestoreThread( m_state );
57+
}
58+
}
59+

0 commit comments

Comments
 (0)