2017-09-08 05:51:28 +00:00
|
|
|
#ifndef Py_INTERNAL_PYSTATE_H
|
|
|
|
#define Py_INTERNAL_PYSTATE_H
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2019-04-17 21:02:26 +00:00
|
|
|
#ifndef Py_BUILD_CORE
|
|
|
|
# error "this header requires Py_BUILD_CORE define"
|
2018-11-01 00:51:40 +00:00
|
|
|
#endif
|
|
|
|
|
2020-04-14 12:26:24 +00:00
|
|
|
#include "pycore_runtime.h" /* PyRuntimeState */
|
2017-09-08 05:51:28 +00:00
|
|
|
|
|
|
|
|
2020-03-20 12:38:58 +00:00
|
|
|
/* Check if the current thread is the main thread.
|
|
|
|
Use _Py_IsMainInterpreter() to check if it's the main interpreter. */
|
|
|
|
static inline int
|
|
|
|
_Py_IsMainThread(void)
|
|
|
|
{
|
|
|
|
unsigned long thread = PyThread_get_thread_ident();
|
|
|
|
return (thread == _PyRuntime.main_thread);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static inline int
|
|
|
|
_Py_IsMainInterpreter(PyThreadState* tstate)
|
|
|
|
{
|
|
|
|
/* Use directly _PyRuntime rather than tstate->interp->runtime, since
|
|
|
|
this function is used in performance critical code path (ceval) */
|
|
|
|
return (tstate->interp == _PyRuntime.interpreters.main);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Only handle signals on the main thread of the main interpreter. */
|
|
|
|
static inline int
|
2020-04-08 21:35:05 +00:00
|
|
|
_Py_ThreadCanHandleSignals(PyInterpreterState *interp)
|
2020-03-20 12:38:58 +00:00
|
|
|
{
|
2020-04-08 21:35:05 +00:00
|
|
|
return (_Py_IsMainThread() && interp == _PyRuntime.interpreters.main);
|
2020-03-20 12:38:58 +00:00
|
|
|
}
|
2019-11-20 16:34:39 +00:00
|
|
|
|
2017-09-08 05:51:28 +00:00
|
|
|
|
2020-03-20 13:50:35 +00:00
|
|
|
/* Only execute pending calls on the main thread. */
|
|
|
|
static inline int
|
|
|
|
_Py_ThreadCanHandlePendingCalls(void)
|
|
|
|
{
|
|
|
|
return _Py_IsMainThread();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-11-01 00:51:40 +00:00
|
|
|
/* Variable and macro for in-line access to current thread
|
|
|
|
and interpreter state */
|
|
|
|
|
2020-05-05 17:56:48 +00:00
|
|
|
#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
|
2020-03-06 23:24:23 +00:00
|
|
|
return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->gilstate.tstate_current);
|
2020-05-05 17:56:48 +00:00
|
|
|
#endif
|
2020-03-06 23:24:23 +00:00
|
|
|
}
|
2019-05-10 21:39:09 +00:00
|
|
|
|
2018-11-01 00:51:40 +00:00
|
|
|
/* Get the current Python thread state.
|
|
|
|
|
|
|
|
Efficient macro reading directly the 'gilstate.tstate_current' atomic
|
|
|
|
variable. The macro is unsafe: it does not check for error and it can
|
|
|
|
return NULL.
|
|
|
|
|
|
|
|
The caller must hold the GIL.
|
|
|
|
|
|
|
|
See also PyThreadState_Get() and PyThreadState_GET(). */
|
2020-05-05 17:56:48 +00:00
|
|
|
static inline PyThreadState*
|
|
|
|
_PyThreadState_GET(void)
|
|
|
|
{
|
|
|
|
#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
|
|
|
|
return _PyThreadState_GetTSS();
|
|
|
|
#else
|
2020-04-08 21:35:05 +00:00
|
|
|
return _PyRuntimeState_GetThreadState(&_PyRuntime);
|
2020-05-05 17:56:48 +00:00
|
|
|
#endif
|
2020-04-08 21:35:05 +00:00
|
|
|
}
|
2018-11-01 00:51:40 +00:00
|
|
|
|
|
|
|
/* Redefine PyThreadState_GET() as an alias to _PyThreadState_GET() */
|
|
|
|
#undef PyThreadState_GET
|
|
|
|
#define PyThreadState_GET() _PyThreadState_GET()
|
|
|
|
|
2020-06-01 14:02:40 +00:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Call Py_FatalError() if tstate is NULL
|
|
|
|
#define _Py_EnsureTstateNotNULL(tstate) \
|
|
|
|
_Py_EnsureFuncTstateNotNULL(__func__, tstate)
|
|
|
|
|
|
|
|
|
2018-11-01 00:51:40 +00:00
|
|
|
/* Get the current interpreter state.
|
|
|
|
|
|
|
|
The macro is unsafe: it does not check for error and it can return NULL.
|
|
|
|
|
|
|
|
The caller must hold the GIL.
|
|
|
|
|
|
|
|
See also _PyInterpreterState_Get()
|
|
|
|
and _PyGILState_GetInterpreterStateUnsafe(). */
|
2020-04-14 13:14:01 +00:00
|
|
|
static inline PyInterpreterState* _PyInterpreterState_GET(void) {
|
2020-04-08 21:35:05 +00:00
|
|
|
PyThreadState *tstate = _PyThreadState_GET();
|
2020-06-01 14:02:40 +00:00
|
|
|
#ifdef Py_DEBUG
|
|
|
|
_Py_EnsureTstateNotNULL(tstate);
|
|
|
|
#endif
|
2020-04-08 21:35:05 +00:00
|
|
|
return tstate->interp;
|
|
|
|
}
|
2018-11-01 00:51:40 +00:00
|
|
|
|
|
|
|
|
2017-09-08 05:51:28 +00:00
|
|
|
/* Other */
|
|
|
|
|
2019-06-04 01:15:09 +00:00
|
|
|
PyAPI_FUNC(void) _PyThreadState_Init(
|
|
|
|
PyThreadState *tstate);
|
|
|
|
PyAPI_FUNC(void) _PyThreadState_DeleteExcept(
|
|
|
|
_PyRuntimeState *runtime,
|
|
|
|
PyThreadState *tstate);
|
2019-05-10 21:39:09 +00:00
|
|
|
|
|
|
|
PyAPI_FUNC(PyThreadState *) _PyThreadState_Swap(
|
|
|
|
struct _gilstate_runtime_state *gilstate,
|
|
|
|
PyThreadState *newts);
|
2019-04-24 14:47:40 +00:00
|
|
|
|
2019-05-27 14:39:22 +00:00
|
|
|
PyAPI_FUNC(PyStatus) _PyInterpreterState_Enable(_PyRuntimeState *runtime);
|
2019-04-24 15:14:33 +00:00
|
|
|
|
2020-06-02 13:51:37 +00:00
|
|
|
#ifdef HAVE_FORK
|
|
|
|
extern PyStatus _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime);
|
|
|
|
extern PyStatus _PyGILState_Reinit(_PyRuntimeState *runtime);
|
|
|
|
extern void _PySignal_AfterFork(void);
|
|
|
|
#endif
|
2017-09-08 05:51:28 +00:00
|
|
|
|
2019-11-22 17:52:27 +00:00
|
|
|
|
|
|
|
PyAPI_FUNC(int) _PyState_AddModule(
|
|
|
|
PyThreadState *tstate,
|
|
|
|
PyObject* module,
|
|
|
|
struct PyModuleDef* def);
|
|
|
|
|
2020-06-03 12:39:59 +00:00
|
|
|
|
|
|
|
PyAPI_FUNC(int) _PyOS_InterruptOccurred(PyThreadState *tstate);
|
|
|
|
|
2017-09-08 05:51:28 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif /* !Py_INTERNAL_PYSTATE_H */
|