|
|
#ifndef Py_INTERNAL_PYSTATE_H |
|
|
#define Py_INTERNAL_PYSTATE_H |
|
|
#ifdef __cplusplus |
|
|
extern "C" { |
|
|
#endif |
|
|
|
|
|
#ifndef Py_BUILD_CORE |
|
|
# error "this header requires Py_BUILD_CORE define" |
|
|
#endif |
|
|
|
|
|
#include "pycore_runtime.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline int |
|
|
_Py_IsMainThread(void) |
|
|
{ |
|
|
unsigned long thread = PyThread_get_thread_ident(); |
|
|
return (thread == _PyRuntime.main_thread); |
|
|
} |
|
|
|
|
|
|
|
|
static inline int |
|
|
_Py_IsMainInterpreter(PyInterpreterState *interp) |
|
|
{ |
|
|
|
|
|
|
|
|
return (interp == _PyRuntime.interpreters.main); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static inline int |
|
|
_Py_ThreadCanHandleSignals(PyInterpreterState *interp) |
|
|
{ |
|
|
return (_Py_IsMainThread() && interp == _PyRuntime.interpreters.main); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static inline int |
|
|
_Py_ThreadCanHandlePendingCalls(void) |
|
|
{ |
|
|
return _Py_IsMainThread(); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS |
|
|
PyAPI_FUNC(PyThreadState*) _PyThreadState_GetTSS(void); |
|
|
#endif |
|
|
|
|
|
static inline PyThreadState* |
|
|
_PyRuntimeState_GetThreadState(_PyRuntimeState *runtime) |
|
|
{ |
|
|
#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS |
|
|
return _PyThreadState_GetTSS(); |
|
|
#else |
|
|
return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->gilstate.tstate_current); |
|
|
#endif |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline PyThreadState* |
|
|
_PyThreadState_GET(void) |
|
|
{ |
|
|
#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS |
|
|
return _PyThreadState_GetTSS(); |
|
|
#else |
|
|
return _PyRuntimeState_GetThreadState(&_PyRuntime); |
|
|
#endif |
|
|
} |
|
|
|
|
|
|
|
|
#undef PyThreadState_GET |
|
|
#define PyThreadState_GET() _PyThreadState_GET() |
|
|
|
|
|
PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalError_TstateNULL(const char *func); |
|
|
|
|
|
static inline void |
|
|
_Py_EnsureFuncTstateNotNULL(const char *func, PyThreadState *tstate) |
|
|
{ |
|
|
if (tstate == NULL) { |
|
|
_Py_FatalError_TstateNULL(func); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#define _Py_EnsureTstateNotNULL(tstate) \ |
|
|
_Py_EnsureFuncTstateNotNULL(__func__, tstate) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline PyInterpreterState* _PyInterpreterState_GET(void) { |
|
|
PyThreadState *tstate = _PyThreadState_GET(); |
|
|
#ifdef Py_DEBUG |
|
|
_Py_EnsureTstateNotNULL(tstate); |
|
|
#endif |
|
|
return tstate->interp; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PyAPI_FUNC(void) _PyThreadState_Init( |
|
|
PyThreadState *tstate); |
|
|
PyAPI_FUNC(void) _PyThreadState_DeleteExcept( |
|
|
_PyRuntimeState *runtime, |
|
|
PyThreadState *tstate); |
|
|
|
|
|
PyAPI_FUNC(PyThreadState *) _PyThreadState_Swap( |
|
|
struct _gilstate_runtime_state *gilstate, |
|
|
PyThreadState *newts); |
|
|
|
|
|
PyAPI_FUNC(PyStatus) _PyInterpreterState_Enable(_PyRuntimeState *runtime); |
|
|
|
|
|
#ifdef HAVE_FORK |
|
|
extern PyStatus _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime); |
|
|
extern PyStatus _PyGILState_Reinit(_PyRuntimeState *runtime); |
|
|
extern void _PySignal_AfterFork(void); |
|
|
#endif |
|
|
|
|
|
|
|
|
PyAPI_FUNC(int) _PyState_AddModule( |
|
|
PyThreadState *tstate, |
|
|
PyObject* module, |
|
|
struct PyModuleDef* def); |
|
|
|
|
|
|
|
|
PyAPI_FUNC(int) _PyOS_InterruptOccurred(PyThreadState *tstate); |
|
|
|
|
|
#ifdef __cplusplus |
|
|
} |
|
|
#endif |
|
|
#endif |
|
|
|