]> git.ipfire.org Git - thirdparty/Python/cpython.git/commit
bpo-39877: Fix PyEval_RestoreThread() for daemon threads (GH-18811)
authorVictor Stinner <vstinner@python.org>
Sun, 8 Mar 2020 10:57:45 +0000 (11:57 +0100)
committerGitHub <noreply@github.com>
Sun, 8 Mar 2020 10:57:45 +0000 (11:57 +0100)
commiteb4e2ae2b8486e8ee4249218b95d94a9f0cc513e
tree6ebca8aaf09b6ee7aa842190f0dc7ab1fd4f8951
parentd5aa2e941ccc44412b95d0e3f0a1789fbcccf403
bpo-39877: Fix PyEval_RestoreThread() for daemon threads (GH-18811)

* 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().
Misc/NEWS.d/next/Core and Builtins/2020-03-06-18-30-00.bpo-39877.bzd1y0.rst [new file with mode: 0644]
Python/ceval.c
Python/ceval_gil.h
Python/pylifecycle.c