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);