mirror of https://github.com/python/cpython
eb4e2ae2b8
* exit_thread_if_finalizing() does now access directly _PyRuntime variable, rather than using tstate->interp->runtime since tstate can be a dangling pointer after Py_Finalize() has been called. * exit_thread_if_finalizing() is now called *before* calling take_gil(). _PyRuntime.finalizing is an atomic variable, we don't need to hold the GIL to access it. * Add ensure_tstate_not_null() function to check that tstate is not NULL at runtime. Check tstate earlier. take_gil() does not longer check if tstate is NULL. Cleanup: * PyEval_RestoreThread() no longer saves/restores errno: it's already done inside take_gil(). * PyEval_AcquireLock(), PyEval_AcquireThread(), PyEval_RestoreThread() and _PyEval_EvalFrameDefault() now check if tstate is valid with the new is_tstate_valid() function which uses _PyMem_IsPtrFreed(). |
||
---|---|---|
.. | ||
next | ||
3.5.0.rst | ||
3.5.0a1.rst | ||
3.5.0a2.rst | ||
3.5.0a3.rst | ||
3.5.0a4.rst | ||
3.5.0b1.rst | ||
3.5.0b2.rst | ||
3.5.0b3.rst | ||
3.5.0b4.rst | ||
3.5.0rc1.rst | ||
3.5.0rc2.rst | ||
3.5.0rc3.rst | ||
3.5.0rc4.rst | ||
3.5.1.rst | ||
3.5.1rc1.rst | ||
3.5.2.rst | ||
3.5.2rc1.rst | ||
3.5.3.rst | ||
3.5.3rc1.rst | ||
3.5.4.rst | ||
3.5.4rc1.rst | ||
3.5.5.rst | ||
3.5.5rc1.rst | ||
3.6.0.rst | ||
3.6.0a1.rst | ||
3.6.0a2.rst | ||
3.6.0a3.rst | ||
3.6.0a4.rst | ||
3.6.0b1.rst | ||
3.6.0b2.rst | ||
3.6.0b3.rst | ||
3.6.0b4.rst | ||
3.6.0rc1.rst | ||
3.6.0rc2.rst | ||
3.6.1.rst | ||
3.6.1rc1.rst | ||
3.6.2.rst | ||
3.6.2rc1.rst | ||
3.6.2rc2.rst | ||
3.6.3.rst | ||
3.6.3rc1.rst | ||
3.6.4.rst | ||
3.6.4rc1.rst | ||
3.6.5.rst | ||
3.6.5rc1.rst | ||
3.6.6.rst | ||
3.6.6rc1.rst | ||
3.7.0.rst | ||
3.7.0a1.rst | ||
3.7.0a2.rst | ||
3.7.0a3.rst | ||
3.7.0a4.rst | ||
3.7.0b1.rst | ||
3.7.0b2.rst | ||
3.7.0b3.rst | ||
3.7.0b4.rst | ||
3.7.0b5.rst | ||
3.7.0rc1.rst | ||
3.8.0a1.rst | ||
3.8.0a2.rst | ||
3.8.0a3.rst | ||
3.8.0a4.rst | ||
3.8.0b1.rst | ||
3.9.0a1.rst | ||
3.9.0a2.rst | ||
3.9.0a3.rst | ||
3.9.0a4.rst |