From 5592f2b9daa24bf74cc616abcc40a29da2bdccb2 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 19 Feb 2021 13:21:28 +0100 Subject: bpo-43268: Replace _PyThreadState_GET() with _PyInterpreterState_GET() (GH-24576) Replace _PyThreadState_GET() with _PyInterpreterState_GET() in functions which only need the current interpreter, but don't need the current Python thread state. Replace also _PyThreadState_UncheckedGet() with _PyThreadState_GET() in faulthandler.c, since _PyThreadState_UncheckedGet() is just an alias to _PyThreadState_GET() in practice. --- Include/internal/pycore_long.h | 7 ++----- Include/internal/pycore_object.h | 10 +++++----- Modules/faulthandler.c | 3 ++- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/Include/internal/pycore_long.h b/Include/internal/pycore_long.h index ec95786..a785b23 100644 --- a/Include/internal/pycore_long.h +++ b/Include/internal/pycore_long.h @@ -14,13 +14,10 @@ extern "C" { // Don't call this function but _PyLong_GetZero() and _PyLong_GetOne() static inline PyObject* __PyLong_GetSmallInt_internal(int value) { - PyThreadState *tstate = _PyThreadState_GET(); -#ifdef Py_DEBUG - _Py_EnsureTstateNotNULL(tstate); -#endif + PyInterpreterState *interp = _PyInterpreterState_GET(); assert(-_PY_NSMALLNEGINTS <= value && value < _PY_NSMALLPOSINTS); size_t index = _PY_NSMALLNEGINTS + value; - PyObject *obj = (PyObject*)tstate->interp->small_ints[index]; + PyObject *obj = (PyObject*)interp->small_ints[index]; // _PyLong_GetZero() and _PyLong_GetOne() must not be called // before _PyLong_Init() nor after _PyLong_Fini() assert(obj != NULL); diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index 3cd27b0..79c1c44 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -8,9 +8,9 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() -#include "pycore_interp.h" // PyInterpreterState.gc -#include "pycore_pystate.h" // _PyThreadState_GET() +#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() +#include "pycore_interp.h" // PyInterpreterState.gc +#include "pycore_pystate.h" // _PyInterpreterState_GET() PyAPI_FUNC(int) _PyType_CheckConsistency(PyTypeObject *type); PyAPI_FUNC(int) _PyDict_CheckConsistency(PyObject *mp, int check_content); @@ -85,8 +85,8 @@ static inline void _PyObject_GC_TRACK( "object is in generation which is garbage collected", filename, lineno, __func__); - PyThreadState *tstate = _PyThreadState_GET(); - PyGC_Head *generation0 = tstate->interp->gc.generation0; + PyInterpreterState *interp = _PyInterpreterState_GET(); + PyGC_Head *generation0 = interp->gc.generation0; PyGC_Head *last = (PyGC_Head*)(generation0->_gc_prev); _PyGCHead_SET_NEXT(last, gc); _PyGCHead_SET_PREV(gc, last); diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index da8b774..350f4cf 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -1,6 +1,7 @@ #include "Python.h" #include "pycore_initconfig.h" // _PyStatus_ERR #include "pycore_pyerrors.h" // _Py_DumpExtensionModules +#include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_traceback.h" // _Py_DumpTracebackThreads #include #include @@ -208,7 +209,7 @@ faulthandler_get_fileno(PyObject **file_ptr) static PyThreadState* get_thread_state(void) { - PyThreadState *tstate = _PyThreadState_UncheckedGet(); + PyThreadState *tstate = _PyThreadState_GET(); if (tstate == NULL) { /* just in case but very unlikely... */ PyErr_SetString(PyExc_RuntimeError, -- cgit v0.12