问题
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 GIL
if (should_i_call_back) {
Py_BLOCK_THREADS
// do stuff that needs the GIL
Py_UNBLOCK_THREADS
}
Py_END_ALLOW_THREADS
return 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.
回答1:
- Yes, it is possible to suppress uninitialized warnings using the -Wno- prefix.
-Wall -Wno-uninitialized
If you want to remove just this warning, you could simply initialize _save
to a null pointer so that it doesn't rely on a function return value... that one line of code and a comment makes sense to me:
PyThreadState *_save;
_save = 0; /* init as null pointer value */
_save = PyEval_SaveThread();
回答2:
My two cents:
- You can suppress specific warnings, but I guess you already knew that.
- It says might be uninitialized :-)
- The only reason I can imagine is compatibility with older C compilers.
I tried digging into the source, but couldn't find any good clues.
回答3:
Ned, you can try one of these:
#pragma GCC diagnostic warning "-Wno-unitialized"
#pragma GCC diagnostic error "-Wno-uninitialized"
#pragma GCC diagnostic ignored "-Wno-uninialized"
Or ignore -Wuninitialized
? According to the documentation, you have to do this before any data or functions are defined. Maybe it will let you disable the warning just for that file?
来源:https://stackoverflow.com/questions/2147029/how-to-avoid-gcc-warning-in-python-c-extension-when-using-py-begin-allow-threads