2017-09-08 02:51:28 -03:00
|
|
|
#ifndef Py_INTERNAL_PYSTATE_H
|
|
|
|
#define Py_INTERNAL_PYSTATE_H
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2019-04-17 18:02:26 -03:00
|
|
|
#ifndef Py_BUILD_CORE
|
|
|
|
# error "this header requires Py_BUILD_CORE define"
|
2018-10-31 21:51:40 -03:00
|
|
|
#endif
|
|
|
|
|
2023-08-21 15:05:59 -03:00
|
|
|
#include "pycore_runtime.h" // _PyRuntime
|
2017-09-08 02:51:28 -03:00
|
|
|
|
|
|
|
|
2020-03-20 09:38:58 -03: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);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-12-07 21:56:06 -04:00
|
|
|
static inline PyInterpreterState *
|
|
|
|
_PyInterpreterState_Main(void)
|
|
|
|
{
|
|
|
|
return _PyRuntime.interpreters.main;
|
|
|
|
}
|
|
|
|
|
2020-03-20 09:38:58 -03:00
|
|
|
static inline int
|
2021-02-19 08:33:31 -04:00
|
|
|
_Py_IsMainInterpreter(PyInterpreterState *interp)
|
2020-03-20 09:38:58 -03:00
|
|
|
{
|
2021-12-07 21:56:06 -04:00
|
|
|
return (interp == _PyInterpreterState_Main());
|
2020-03-20 09:38:58 -03:00
|
|
|
}
|
|
|
|
|
2023-04-24 20:23:57 -03:00
|
|
|
static inline int
|
|
|
|
_Py_IsMainInterpreterFinalizing(PyInterpreterState *interp)
|
|
|
|
{
|
|
|
|
return (_PyRuntimeState_GetFinalizing(interp->runtime) != NULL &&
|
|
|
|
interp == &interp->runtime->_main_interpreter);
|
|
|
|
}
|
|
|
|
|
2020-03-20 09:38:58 -03:00
|
|
|
|
2021-09-27 13:00:32 -03:00
|
|
|
static inline const PyConfig *
|
|
|
|
_Py_GetMainConfig(void)
|
|
|
|
{
|
2021-12-07 21:56:06 -04:00
|
|
|
PyInterpreterState *interp = _PyInterpreterState_Main();
|
2021-09-27 13:00:32 -03:00
|
|
|
if (interp == NULL) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
return _PyInterpreterState_GetConfig(interp);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-03-20 09:38:58 -03:00
|
|
|
/* Only handle signals on the main thread of the main interpreter. */
|
|
|
|
static inline int
|
2020-04-08 18:35:05 -03:00
|
|
|
_Py_ThreadCanHandleSignals(PyInterpreterState *interp)
|
2020-03-20 09:38:58 -03:00
|
|
|
{
|
2021-12-07 21:56:06 -04:00
|
|
|
return (_Py_IsMainThread() && _Py_IsMainInterpreter(interp));
|
2020-03-20 09:38:58 -03:00
|
|
|
}
|
2019-11-20 12:34:39 -04:00
|
|
|
|
2017-09-08 02:51:28 -03:00
|
|
|
|
2023-05-04 11:21:01 -03:00
|
|
|
/* Variable and static inline functions for in-line access to current thread
|
2018-10-31 21:51:40 -03:00
|
|
|
and interpreter state */
|
|
|
|
|
2023-04-24 14:17:02 -03:00
|
|
|
#if defined(HAVE_THREAD_LOCAL) && !defined(Py_BUILD_CORE_MODULE)
|
|
|
|
extern _Py_thread_local PyThreadState *_Py_tss_tstate;
|
|
|
|
#endif
|
2023-08-24 12:40:56 -03:00
|
|
|
|
|
|
|
// Export for most shared extensions, used via _PyThreadState_GET() static
|
|
|
|
// inline function.
|
2023-07-25 00:48:04 -03:00
|
|
|
PyAPI_FUNC(PyThreadState *) _PyThreadState_GetCurrent(void);
|
2019-05-10 18:39:09 -03:00
|
|
|
|
2018-10-31 21:51:40 -03:00
|
|
|
/* Get the current Python thread state.
|
|
|
|
|
2023-04-24 14:17:02 -03:00
|
|
|
This function is unsafe: it does not check for error and it can return NULL.
|
2018-10-31 21:51:40 -03:00
|
|
|
|
|
|
|
The caller must hold the GIL.
|
|
|
|
|
2021-10-13 09:09:13 -03:00
|
|
|
See also PyThreadState_Get() and _PyThreadState_UncheckedGet(). */
|
2020-05-05 14:56:48 -03:00
|
|
|
static inline PyThreadState*
|
|
|
|
_PyThreadState_GET(void)
|
|
|
|
{
|
2023-04-24 14:17:02 -03:00
|
|
|
#if defined(HAVE_THREAD_LOCAL) && !defined(Py_BUILD_CORE_MODULE)
|
|
|
|
return _Py_tss_tstate;
|
|
|
|
#else
|
|
|
|
return _PyThreadState_GetCurrent();
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-06-01 11:02:40 -03:00
|
|
|
static inline void
|
|
|
|
_Py_EnsureFuncTstateNotNULL(const char *func, PyThreadState *tstate)
|
|
|
|
{
|
|
|
|
if (tstate == NULL) {
|
2022-08-24 10:21:01 -03:00
|
|
|
_Py_FatalErrorFunc(func,
|
|
|
|
"the function must be called with the GIL held, "
|
|
|
|
"after Python initialization and before Python finalization, "
|
|
|
|
"but the GIL is released (the current Python thread state is NULL)");
|
2020-06-01 11:02:40 -03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Call Py_FatalError() if tstate is NULL
|
|
|
|
#define _Py_EnsureTstateNotNULL(tstate) \
|
2022-06-20 11:04:52 -03:00
|
|
|
_Py_EnsureFuncTstateNotNULL(__func__, (tstate))
|
2020-06-01 11:02:40 -03:00
|
|
|
|
|
|
|
|
2018-10-31 21:51:40 -03:00
|
|
|
/* Get the current interpreter state.
|
|
|
|
|
2023-05-04 11:21:01 -03:00
|
|
|
The function is unsafe: it does not check for error and it can return NULL.
|
2018-10-31 21:51:40 -03:00
|
|
|
|
|
|
|
The caller must hold the GIL.
|
|
|
|
|
2023-07-01 20:44:07 -03:00
|
|
|
See also PyInterpreterState_Get()
|
2018-10-31 21:51:40 -03:00
|
|
|
and _PyGILState_GetInterpreterStateUnsafe(). */
|
2020-04-14 10:14:01 -03:00
|
|
|
static inline PyInterpreterState* _PyInterpreterState_GET(void) {
|
2020-04-08 18:35:05 -03:00
|
|
|
PyThreadState *tstate = _PyThreadState_GET();
|
2020-06-01 11:02:40 -03:00
|
|
|
#ifdef Py_DEBUG
|
|
|
|
_Py_EnsureTstateNotNULL(tstate);
|
|
|
|
#endif
|
2020-04-08 18:35:05 -03:00
|
|
|
return tstate->interp;
|
|
|
|
}
|
2018-10-31 21:51:40 -03:00
|
|
|
|
|
|
|
|
2021-10-15 11:06:30 -03:00
|
|
|
// PyThreadState functions
|
2017-09-08 02:51:28 -03:00
|
|
|
|
2023-07-24 22:49:28 -03:00
|
|
|
extern PyThreadState * _PyThreadState_New(PyInterpreterState *interp);
|
|
|
|
extern void _PyThreadState_Bind(PyThreadState *tstate);
|
|
|
|
extern void _PyThreadState_DeleteExcept(PyThreadState *tstate);
|
2019-05-10 18:39:09 -03:00
|
|
|
|
2023-07-24 22:49:28 -03:00
|
|
|
// Export for '_testinternalcapi' shared extension
|
2023-07-01 22:39:38 -03:00
|
|
|
PyAPI_FUNC(PyObject*) _PyThreadState_GetDict(PyThreadState *tstate);
|
|
|
|
|
|
|
|
/* The implementation of sys._current_frames() Returns a dict mapping
|
|
|
|
thread id to that thread's current frame.
|
|
|
|
*/
|
|
|
|
extern PyObject* _PyThread_CurrentFrames(void);
|
|
|
|
|
|
|
|
/* The implementation of sys._current_exceptions() Returns a dict mapping
|
|
|
|
thread id to that thread's current exception.
|
|
|
|
*/
|
|
|
|
extern PyObject* _PyThread_CurrentExceptions(void);
|
|
|
|
|
2021-10-15 11:06:30 -03:00
|
|
|
|
|
|
|
/* Other */
|
|
|
|
|
2023-07-24 22:49:28 -03:00
|
|
|
extern PyThreadState * _PyThreadState_Swap(
|
2023-01-19 19:04:14 -04:00
|
|
|
_PyRuntimeState *runtime,
|
2019-05-10 18:39:09 -03:00
|
|
|
PyThreadState *newts);
|
2019-04-24 11:47:40 -03:00
|
|
|
|
2023-07-24 22:49:28 -03:00
|
|
|
extern PyStatus _PyInterpreterState_Enable(_PyRuntimeState *runtime);
|
2019-04-24 12:14:33 -03:00
|
|
|
|
2020-06-02 10:51:37 -03:00
|
|
|
#ifdef HAVE_FORK
|
|
|
|
extern PyStatus _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime);
|
|
|
|
extern void _PySignal_AfterFork(void);
|
|
|
|
#endif
|
2017-09-08 02:51:28 -03:00
|
|
|
|
2023-07-24 22:49:28 -03:00
|
|
|
// Export for the stable ABI
|
2023-02-16 17:05:31 -04:00
|
|
|
PyAPI_FUNC(int) _PyState_AddModule(
|
|
|
|
PyThreadState *tstate,
|
|
|
|
PyObject* module,
|
|
|
|
PyModuleDef* def);
|
|
|
|
|
|
|
|
|
2023-07-24 22:49:28 -03:00
|
|
|
extern int _PyOS_InterruptOccurred(PyThreadState *tstate);
|
2020-06-03 09:39:59 -03:00
|
|
|
|
2023-01-15 11:09:26 -04:00
|
|
|
#define HEAD_LOCK(runtime) \
|
|
|
|
PyThread_acquire_lock((runtime)->interpreters.mutex, WAIT_LOCK)
|
|
|
|
#define HEAD_UNLOCK(runtime) \
|
|
|
|
PyThread_release_lock((runtime)->interpreters.mutex)
|
|
|
|
|
2023-07-01 22:39:38 -03:00
|
|
|
// Get the configuration of the current interpreter.
|
|
|
|
// The caller must hold the GIL.
|
2023-07-24 22:49:28 -03:00
|
|
|
// Export for test_peg_generator.
|
2023-07-01 22:39:38 -03:00
|
|
|
PyAPI_FUNC(const PyConfig*) _Py_GetConfig(void);
|
|
|
|
|
2023-01-15 11:09:26 -04:00
|
|
|
|
2017-09-08 02:51:28 -03:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif /* !Py_INTERNAL_PYSTATE_H */
|