Add _PyThreadState_UncheckedGet()

Issue #26154: Add a new private _PyThreadState_UncheckedGet() function which
gets the current thread state, but don't call Py_FatalError() if it is NULL.

Python 3.5.1 removed the _PyThreadState_Current symbol from the Python C API to
no more expose complex and private atomic types. Atomic types depends on the
compiler or can even depend on compiler options. The new function
_PyThreadState_UncheckedGet() allows to get the variable value without having
to care of the exact implementation of atomic types.

Changes:

* Replace direct usage of the _PyThreadState_Current variable with a call to
  _PyThreadState_UncheckedGet().
* In pystate.c, replace direct usage of the _PyThreadState_Current variable
  with the PyThreadState_GET() macro for readability.
* Document also PyThreadState_Get() in pystate.h
This commit is contained in:
Victor Stinner 2016-01-20 11:12:38 +01:00
parent aebb6d3682
commit bfd316e750
7 changed files with 42 additions and 26 deletions

View file

@ -152,13 +152,7 @@ PyErr_SetString(PyObject *exception, const char *string)
PyObject *
PyErr_Occurred(void)
{
/* If there is no thread state, PyThreadState_GET calls
Py_FatalError, which calls PyErr_Occurred. To avoid the
resulting infinite loop, we inline PyThreadState_GET here and
treat no thread as no error. */
PyThreadState *tstate =
((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current));
PyThreadState *tstate = _PyThreadState_UncheckedGet();
return tstate == NULL ? NULL : tstate->curexc_type;
}