17db96d56Sopenharmony_ci#ifndef Py_INTERNAL_PYSTATE_H
27db96d56Sopenharmony_ci#define Py_INTERNAL_PYSTATE_H
37db96d56Sopenharmony_ci#ifdef __cplusplus
47db96d56Sopenharmony_ciextern "C" {
57db96d56Sopenharmony_ci#endif
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci#ifndef Py_BUILD_CORE
87db96d56Sopenharmony_ci#  error "this header requires Py_BUILD_CORE define"
97db96d56Sopenharmony_ci#endif
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci#include "pycore_runtime.h"   /* PyRuntimeState */
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci/* Check if the current thread is the main thread.
157db96d56Sopenharmony_ci   Use _Py_IsMainInterpreter() to check if it's the main interpreter. */
167db96d56Sopenharmony_cistatic inline int
177db96d56Sopenharmony_ci_Py_IsMainThread(void)
187db96d56Sopenharmony_ci{
197db96d56Sopenharmony_ci    unsigned long thread = PyThread_get_thread_ident();
207db96d56Sopenharmony_ci    return (thread == _PyRuntime.main_thread);
217db96d56Sopenharmony_ci}
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_cistatic inline PyInterpreterState *
257db96d56Sopenharmony_ci_PyInterpreterState_Main(void)
267db96d56Sopenharmony_ci{
277db96d56Sopenharmony_ci    return _PyRuntime.interpreters.main;
287db96d56Sopenharmony_ci}
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_cistatic inline int
317db96d56Sopenharmony_ci_Py_IsMainInterpreter(PyInterpreterState *interp)
327db96d56Sopenharmony_ci{
337db96d56Sopenharmony_ci    return (interp == _PyInterpreterState_Main());
347db96d56Sopenharmony_ci}
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_cistatic inline const PyConfig *
387db96d56Sopenharmony_ci_Py_GetMainConfig(void)
397db96d56Sopenharmony_ci{
407db96d56Sopenharmony_ci    PyInterpreterState *interp = _PyInterpreterState_Main();
417db96d56Sopenharmony_ci    if (interp == NULL) {
427db96d56Sopenharmony_ci        return NULL;
437db96d56Sopenharmony_ci    }
447db96d56Sopenharmony_ci    return _PyInterpreterState_GetConfig(interp);
457db96d56Sopenharmony_ci}
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci/* Only handle signals on the main thread of the main interpreter. */
497db96d56Sopenharmony_cistatic inline int
507db96d56Sopenharmony_ci_Py_ThreadCanHandleSignals(PyInterpreterState *interp)
517db96d56Sopenharmony_ci{
527db96d56Sopenharmony_ci    return (_Py_IsMainThread() && _Py_IsMainInterpreter(interp));
537db96d56Sopenharmony_ci}
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ci/* Only execute pending calls on the main thread. */
577db96d56Sopenharmony_cistatic inline int
587db96d56Sopenharmony_ci_Py_ThreadCanHandlePendingCalls(void)
597db96d56Sopenharmony_ci{
607db96d56Sopenharmony_ci    return _Py_IsMainThread();
617db96d56Sopenharmony_ci}
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci/* Variable and macro for in-line access to current thread
657db96d56Sopenharmony_ci   and interpreter state */
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_cistatic inline PyThreadState*
687db96d56Sopenharmony_ci_PyRuntimeState_GetThreadState(_PyRuntimeState *runtime)
697db96d56Sopenharmony_ci{
707db96d56Sopenharmony_ci    return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->gilstate.tstate_current);
717db96d56Sopenharmony_ci}
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ci/* Get the current Python thread state.
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci   Efficient macro reading directly the 'gilstate.tstate_current' atomic
767db96d56Sopenharmony_ci   variable. The macro is unsafe: it does not check for error and it can
777db96d56Sopenharmony_ci   return NULL.
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci   The caller must hold the GIL.
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ci   See also PyThreadState_Get() and _PyThreadState_UncheckedGet(). */
827db96d56Sopenharmony_cistatic inline PyThreadState*
837db96d56Sopenharmony_ci_PyThreadState_GET(void)
847db96d56Sopenharmony_ci{
857db96d56Sopenharmony_ci    return _PyRuntimeState_GetThreadState(&_PyRuntime);
867db96d56Sopenharmony_ci}
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ciPyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalError_TstateNULL(const char *func);
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_cistatic inline void
917db96d56Sopenharmony_ci_Py_EnsureFuncTstateNotNULL(const char *func, PyThreadState *tstate)
927db96d56Sopenharmony_ci{
937db96d56Sopenharmony_ci    if (tstate == NULL) {
947db96d56Sopenharmony_ci        _Py_FatalError_TstateNULL(func);
957db96d56Sopenharmony_ci    }
967db96d56Sopenharmony_ci}
977db96d56Sopenharmony_ci
987db96d56Sopenharmony_ci// Call Py_FatalError() if tstate is NULL
997db96d56Sopenharmony_ci#define _Py_EnsureTstateNotNULL(tstate) \
1007db96d56Sopenharmony_ci    _Py_EnsureFuncTstateNotNULL(__func__, tstate)
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci
1037db96d56Sopenharmony_ci/* Get the current interpreter state.
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci   The macro is unsafe: it does not check for error and it can return NULL.
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ci   The caller must hold the GIL.
1087db96d56Sopenharmony_ci
1097db96d56Sopenharmony_ci   See also _PyInterpreterState_Get()
1107db96d56Sopenharmony_ci   and _PyGILState_GetInterpreterStateUnsafe(). */
1117db96d56Sopenharmony_cistatic inline PyInterpreterState* _PyInterpreterState_GET(void) {
1127db96d56Sopenharmony_ci    PyThreadState *tstate = _PyThreadState_GET();
1137db96d56Sopenharmony_ci#ifdef Py_DEBUG
1147db96d56Sopenharmony_ci    _Py_EnsureTstateNotNULL(tstate);
1157db96d56Sopenharmony_ci#endif
1167db96d56Sopenharmony_ci    return tstate->interp;
1177db96d56Sopenharmony_ci}
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci// PyThreadState functions
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ciPyAPI_FUNC(void) _PyThreadState_SetCurrent(PyThreadState *tstate);
1237db96d56Sopenharmony_ci// We keep this around exclusively for stable ABI compatibility.
1247db96d56Sopenharmony_ciPyAPI_FUNC(void) _PyThreadState_Init(
1257db96d56Sopenharmony_ci    PyThreadState *tstate);
1267db96d56Sopenharmony_ciPyAPI_FUNC(void) _PyThreadState_DeleteExcept(
1277db96d56Sopenharmony_ci    _PyRuntimeState *runtime,
1287db96d56Sopenharmony_ci    PyThreadState *tstate);
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_cistatic inline void
1327db96d56Sopenharmony_ci_PyThreadState_UpdateTracingState(PyThreadState *tstate)
1337db96d56Sopenharmony_ci{
1347db96d56Sopenharmony_ci    bool use_tracing =
1357db96d56Sopenharmony_ci        (tstate->tracing == 0) &&
1367db96d56Sopenharmony_ci        (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL);
1377db96d56Sopenharmony_ci    tstate->cframe->use_tracing = (use_tracing ? 255 : 0);
1387db96d56Sopenharmony_ci}
1397db96d56Sopenharmony_ci
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci/* Other */
1427db96d56Sopenharmony_ci
1437db96d56Sopenharmony_ciPyAPI_FUNC(PyThreadState *) _PyThreadState_Swap(
1447db96d56Sopenharmony_ci    struct _gilstate_runtime_state *gilstate,
1457db96d56Sopenharmony_ci    PyThreadState *newts);
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ciPyAPI_FUNC(PyStatus) _PyInterpreterState_Enable(_PyRuntimeState *runtime);
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ci#ifdef HAVE_FORK
1507db96d56Sopenharmony_ciextern PyStatus _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime);
1517db96d56Sopenharmony_ciextern PyStatus _PyGILState_Reinit(_PyRuntimeState *runtime);
1527db96d56Sopenharmony_ciextern void _PySignal_AfterFork(void);
1537db96d56Sopenharmony_ci#endif
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyState_AddModule(
1577db96d56Sopenharmony_ci    PyThreadState *tstate,
1587db96d56Sopenharmony_ci    PyObject* module,
1597db96d56Sopenharmony_ci    PyModuleDef* def);
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyOS_InterruptOccurred(PyThreadState *tstate);
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci#ifdef __cplusplus
1657db96d56Sopenharmony_ci}
1667db96d56Sopenharmony_ci#endif
1677db96d56Sopenharmony_ci#endif /* !Py_INTERNAL_PYSTATE_H */
168