[Python-Dev] Bug in generator if the generator in created in a C thread
Victor Stinner
victor.stinner at gmail.com
Thu Mar 29 23:26:42 CEST 2012
More information about the Python-Dev mailing list
Thu Mar 29 23:26:42 CEST 2012
- Previous message: [Python-Dev] Bug in generator if the generator in created in a C thread
- Next message: [Python-Dev] Bug in generator if the generator in created in a C thread
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On 29/03/2012 21:35, Tim Lesher wrote: > From a theoretical standpoint, I can't quite decide what the real error is: > > 1) the fact that PyGILState_Release() destroys a temporary thread > state that may still be referenced by some objects, or > 2) the fact that some code is trying to keep frame objects after the > creating thread state no longer exists. > > This week I've been leaning toward 2), but then I realized that > keeping frames post-thread-death is not that uncommon (for example, > debuggers and other diagnostic techniques like > http://nedbatchelder.com/blog/200711/rethrowing_exceptions_in_python.html). The problem is not the frame, but the Python thread state referenced by the frame. It's a private attribute. My patch just updates this reference before running the generator (and it clears the reference when the generator excution is stopped or finished). > Locally we added some (unfortunate) code to our 3.1.2 port to wrap > PyGILState_Ensure(), which I thought had sidestepped the issue for us: > > void takeGIL() > { > PyGILState_Ensure(); > // This has the side effect of keeping such thread states alive until > // the interpreter is finalized; however, all thread state objects get > // unconditionally deleted during Py_Finalize, so they won't leak. > PyThreadState* pThreadState = PyGILState_GetThisThreadState(); > if (pThreadState->gilstate_counter == 1) > { > ++pThreadState->gilstate_counter; > } > } > > But clearly that can't be a correct answer (and it may not even be a > functioning one, given that I'm seeing a similar issue again). You may leak memory if your threads have a short lifetime and you create many threads. For example if one thread is only used to process one request and then is destroyed. Victor
- Previous message: [Python-Dev] Bug in generator if the generator in created in a C thread
- Next message: [Python-Dev] Bug in generator if the generator in created in a C thread
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-Dev mailing list