From fff7bbfdb6b7c143b73b6b4b6b40e828c101110c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 20 Nov 2019 17:34:39 +0100 Subject: [PATCH] bpo-38858: Add _Py_IsMainInterpreter(tstate) (GH-17293) --- Include/internal/pycore_pystate.h | 2 ++ Modules/_threadmodule.c | 6 +++--- Python/pystate.c | 6 ++++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 0c3c1e3df34..936e9cbc65f 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -269,6 +269,8 @@ PyAPI_FUNC(void) _PyRuntime_Finalize(void); #define _Py_CURRENTLY_FINALIZING(runtime, tstate) \ (runtime->finalizing == tstate) +PyAPI_FUNC(int) _Py_IsMainInterpreter(PyThreadState* tstate); + /* Variable and macro for in-line access to current thread and interpreter state */ diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index befd213bfeb..4a651cea6c7 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -1466,9 +1466,9 @@ static PyObject * _thread__is_main_interpreter_impl(PyObject *module) /*[clinic end generated code: output=7dd82e1728339adc input=cc1eb00fd4598915]*/ { - _PyRuntimeState *runtime = &_PyRuntime; - PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp; - return PyBool_FromLong(interp == runtime->interpreters.main); + PyThreadState *tstate = _PyThreadState_GET(); + int is_main = _Py_IsMainInterpreter(tstate); + return PyBool_FromLong(is_main); } static PyMethodDef thread_methods[] = { diff --git a/Python/pystate.c b/Python/pystate.c index 2fc563bf583..0a6d035836e 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -159,6 +159,12 @@ _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime) #define HEAD_UNLOCK(runtime) \ PyThread_release_lock((runtime)->interpreters.mutex) +int +_Py_IsMainInterpreter(PyThreadState* tstate) +{ + return (tstate->interp == tstate->interp->runtime->interpreters.main); +} + /* Forward declaration */ static void _PyGILState_NoteThreadState( struct _gilstate_runtime_state *gilstate, PyThreadState* tstate);