[ https://issues.apache.org/jira/browse/MODPYTHON-217?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12523668 ]
Deron Meranda commented on MODPYTHON-217: ----------------------------------------- Another real-world case where this comes up is with the Xapian search engine (http://xapian.org/). It also is SWIG generated. See their bug #185, http://www.xapian.org/cgi-bin/bugzilla/show_bug.cgi?id=185 > Python 2.3 and simplified GIL state API still causes problems. > -------------------------------------------------------------- > > Key: MODPYTHON-217 > URL: https://issues.apache.org/jira/browse/MODPYTHON-217 > Project: mod_python > Issue Type: Bug > Components: core > Affects Versions: 3.3.x, 3.2.10 > Reporter: Graham Dumpleton > > There are still problems in mod_python when third party extension modules are > used which make use of the Python simplified GIL state API. Specifically, if > C code makes calls to PyGILState_Ensure() when it already holds the Python > GIL and has an active thread state, but the active thread was one which was > originally created outside of Python, such as by Apache with mod_python, then > the call to PyGILState_Ensure() results in a dead lock. This is occurring > because the PyGILState_Ensure() function finds it does not know anything > about the current thread ID and therefore assumes it needs to create a new > thread state for it and make that the active thread state. In doing that > though it tries to acquire the GIL when the thread already holds it, > resulting in the deadlock. > At this stage it is believed this only occurs with Python 2.3 and shouldn't > be a problem with later versions of Python. This is the case as later > versions of Python were modified so that PyThreadState_New() will register > the thread with the underpinnings of the PyGILState_???() mechanism and > because it already knows about it, it will not attempt to create a new thread > state object and so the deadlock will not occur. > When C code is hand crafted it is unlikely that anyone would call > PyGILState_Ensure() when they already know they hold the GIL, ie., when > calling out of Python code, but SWIG when used with the -threads option does > exactly this. For example: > SWIGINTERN PyObject *_wrap_ap_get_server_version(PyObject > *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; > char *result = 0 ; > > SWIG_PYTHON_THREAD_BEGIN_BLOCK; > if (!PyArg_ParseTuple(args,(char *)":ap_get_server_version")) SWIG_fail; > { > SWIG_PYTHON_THREAD_BEGIN_ALLOW; > result = (char *)ap_get_server_version(); > SWIG_PYTHON_THREAD_END_ALLOW; > } > resultobj = SWIG_FromCharPtr((const char *)result); > SWIG_PYTHON_THREAD_END_BLOCK; > return resultobj; > fail: > SWIG_PYTHON_THREAD_END_BLOCK; > return NULL; > } > where SWIG_PYTHON_THREAD_BEGIN_BLOCK eventually expands to a call to > PyGILState_Ensure(). > The only solution to this problem would be for mod_python to behave > differently when it is acquiring a thread state against the main Python > interpreter, ie. 'main_interpreter'. Specifically, rather than use > PyThreadState_New() etc, it should call PyGILState_Ensure() instead. When > needing to release the main Python interpreter it should call > PyGILState_Release(). It should continue to work as before for all other > interpreters and anyone with GILState code would need to ensure they are > using 'main_interpreter'. > Unfortunately at the moment making this change is not completely straight > forward as when an interpreter is being released it isn't known that it is > the main Python interpreter. Thus some knowledge that it is the main > interpreter would need to be carried into the call. The only other option is > that the list of all active interpreters is traversed and the last one in the > list is assumed to be the main interpreter. Then if the interpreter being > released matches that then act differently. > Note that at present the acquire/release methods are exported as optional > functions so that other Apache modules use them. It is unlikely that anyone > is making use of them, so changing the in/out parameters of the functions > would possibly be acceptable. > Also note that maintaining support for threaded and non threaded Python and > now this GIL state variation is going to make the code even more messy. As > such it might be worthwhile considering dropping support for non threaded > Python. These days Python defaults to being threaded anyway, and highly > unlikely that someone would want to use non thread Python with mod_python > anyway. When ever any development of mod_python is done, no testing is ever > done with a non threaded Python anyway and so it is possibly questionable if > that support still works. > FWIW, this issue came up as a result of queries expressed in: > http://www.modpython.org/pipermail/mod_python/2007-April/023445.html > The GIL state issue has attempted to be addressed before in MODPYTHON-77 but > this particular issue not captured in that. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.