The simplest way to manipulate the GIL in Python C extensions is to use the macros provided:
my_awesome_C_function()
{blah;Py_BEGIN_ALLOW_THREADS// do stuff that doesn't need the GILif (should_i_call_back) {Py_BLOCK_THREADS// do stuff that needs the GILPy_UNBLOCK_THREADS}Py_END_ALLOW_THREADSreturn blah blah;
}
This works great, letting me release the GIL for the bulk of my code, but re-grabbing it for small bits of code that need it.
The problem is when I compile this with gcc, I get:
ext/engine.c:548: warning: '_save' might be used uninitialized in this function
because Py_BEGIN_ALLOW_THREADS is defined like this:
#define Py_BEGIN_ALLOW_THREADS { \PyThreadState *_save; \_save = PyEval_SaveThread();
So, three questions:
- Is it possible to suppress gcc's warning,
- Does anyone have any idea why gcc thinks
_save
might be used uninitialized, since it is assigned to immediately after its declaration, and - Why wouldn't the macro have been defined to declare and initialize the variable in one statement to avoid the issue?
(the last two are really just for my own curiosity).
I can avoid the issue by not using the macros and doing it all myself, but I'd rather not.