From eb7395e698761b056e83c6c8a38bb731c1f647a0 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 20 Nov 2019 14:23:59 +0100 Subject: [PATCH] bpo-38858: Add _Py_IsMainInterpreter(tstate) --- 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 0c3c1e3df34de1..936e9cbc65f7ad 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 befd213bfebaa9..4a651cea6c7ff7 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 2fc563bf5836d9..0a6d035836e6e8 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);