On 3/6/2009 2:48 PM, Sturla Molden wrote:

> {
>     PyGILState_STATE _gilstate = PyGILState_Ensure();
> 
>     /* now we have the GIL */
> 
>     PyGILState_Release(_gilstate);
> }

What this means is PyGILState_Release does not release the GIL. It just 
resets the GIL to whatever it was before PyGILState_Ensure was called. So,

{
      /* We might or might not hold the GIL. */

      PyGILState_STATE _gilstate = PyGILState_Ensure();

      /* We have the GIL.
         Now its safe to use the rest of Python's C API. */

      PyGILState_Release(_gilstate);

      /* We might or might not hold the GIL. */

}

Thus,

with nogil:
   with gil:
     with gil:
       with nogil:
         <suite>

Would be

Py_BEGIN_ALLOW_THREADS
{
   PyGILState_STATE _gilstate = PyGILState_Ensure();
   {
     PyGILState_STATE _gilstate = PyGILState_Ensure();
     {
       Py_BEGIN_ALLOW_THREADS
       {
         /*suite*/
       }
       Py_END_ALLOW_THREADS
     }
     PyGILState_Release(_gilstate);
   }
   PyGILState_Release(_gilstate);
}
Py_END_ALLOW_THREADS





S.M.




_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to