[Cython] GIL handling C code (was: [cython-users] What's up with PyEval_InitThreads() in python 2.7?)

mark florisson markflorisson88 at gmail.com
Tue Feb 28 21:20:17 CET 2012


On 28 February 2012 19:58, Stefan Behnel <stefan_ml at behnel.de> wrote:
> mark florisson, 28.02.2012 16:35:
>> Basically, the cleanup code only needs a matching release because the
>> corresponding acquire is in EnsureGILNode, which wraps the function
>> body in case of a nogil function with a 'with gil' block. Any changes
>> to the conditions in FuncDefNode will have to be reflected by the code
>> that does that wrapping. Changing the refnanny macro for the cleanup
>> code will not avail anything, as the GIL is already ensured.
>
> Regarding the "with gil" code, ISTM that the "finally" code in the with_gil
> test is being duplicated. I noticed this when I moved the refnanny's GIL
> state into a block local variable and that broke the C code. Basically, the
> with-gil block had declared the variable in its own block, but was then
> trying to access that variable in a second finally clause, further down and
> outside of the with-gil block.
>
> Looks like a bug to me.

That's not a bug, that's how it is implemented. At setup, a variable
__pyx_gilstate_save is declared, which is also used for teardown. Any
with GIL blocks use C block scoping to do the same thing. The with
block is itself a try/finally, so you get a try/finally wrapped in a
try/finally. The code uses try/finally for it's way of trapping
control flow, allowing some code to execute and resuming control flow
afterwards.


> Stefan
> _______________________________________________
> cython-devel mailing list
> cython-devel at python.org
> http://mail.python.org/mailman/listinfo/cython-devel


More information about the cython-devel mailing list