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