bpo-38858: Add _Py_IsMainInterpreter(tstate) (GH-17293)
diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h
index 0c3c1e3..936e9cb 100644
--- a/Include/internal/pycore_pystate.h
+++ b/Include/internal/pycore_pystate.h
@@ -269,6 +269,8 @@
#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 befd213..4a651ce 100644
--- a/Modules/_threadmodule.c
+++ b/Modules/_threadmodule.c
@@ -1466,9 +1466,9 @@
_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 2fc563b..0a6d035 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -159,6 +159,12 @@
#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);