
On Tue, Aug 14, 2012 at 3:13 PM, Charles R Harris <charlesr.harris@gmail.com> wrote:
On Tue, Aug 14, 2012 at 7:47 AM, Aron Ahmadia <aron@ahmadia.net> wrote:
Hi all,
Installing numpy 1.6.2 against a Python interpreter built with the --without threads currently fails due to missing references to PyGILState_Ensure and PyGILState_Release. The references appear to be coming from the following code in nditer.c.src:
NPY_NO_EXPORT void NpyIter_DebugPrint(NpyIter *iter) { // <snip> PyGILState_STATE gilstate = PyGILState_Ensure(); // <snip> PyGILState_Release(gilstate); }
Since this is debugging code, I'm guessing it doesn't get called very frequently, and I could probably just #ifdef it out or use the NPY macros for grabbing the GIL for a non-threaded build: (NPY_ALLOW_C_API and NPY_DISABLE_C_API), but I don't understand why it's grabbing the GIL in the first place. Where is it calling into the interpreter? Does it need the GIL for something else? I'm hesitant to touch this code and issue a pull request until I understand what it's trying to do.
Heading on over to the master branch at numpy/numpy, I'm starting to notice more unprotected PyGILState references creeping into the development code. Even the Python developers seem to think that nobody is using --without-threaded, so I'm not going to make a strong case for being more careful, but I do want to point it out in case you want to keep the numpy sources correct for this case.
Some parts of the numpy code release the GIL, so it needs to be reacquired in order to call the Python C_API. A quick look shows a call to PyObject_Print in the function and there may be other such calls. The right fix is probably to use a couple of ifdefs if there is an easy way to determine the Python interpreter configuration <looks>... WITH_THREAD seems to be the right flag.
#ifdef WITH_THREAD PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void); #endif
Could you give that a shot? TIA,
The NPY_*_THREADS macros appear to already check for WITH_THREAD automatically. I think we'd be happy to apply a patch that cleans up numpy's direct PyGIL_* calls to use the NPY_*_THREADS macros instead. -n