| #ifndef Py_INTERNAL_PYSTATE_H | |
| #define Py_INTERNAL_PYSTATE_H | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif | |
| #include "pystate.h" | |
| #include "pyatomic.h" | |
| #include "pythread.h" | |
| #include "internal/mem.h" | |
| #include "internal/ceval.h" | |
| #include "internal/warnings.h" | |
| /* GIL state */ | |
| struct _gilstate_runtime_state { | |
| int check_enabled; | |
| /* Assuming the current thread holds the GIL, this is the | |
| PyThreadState for the current thread. */ | |
| _Py_atomic_address tstate_current; | |
| PyThreadFrameGetter getframe; | |
| /* The single PyInterpreterState used by this process' | |
| GILState implementation | |
| */ | |
| /* TODO: Given interp_main, it may be possible to kill this ref */ | |
| PyInterpreterState *autoInterpreterState; | |
| Py_tss_t autoTSSkey; | |
| }; | |
| /* hook for PyEval_GetFrame(), requested for Psyco */ | |
| #define _PyThreadState_GetFrame _PyRuntime.gilstate.getframe | |
| /* Issue #26558: Flag to disable PyGILState_Check(). | |
| If set to non-zero, PyGILState_Check() always return 1. */ | |
| #define _PyGILState_check_enabled _PyRuntime.gilstate.check_enabled | |
| typedef struct { | |
| /* Full path to the Python program */ | |
| wchar_t *program_full_path; | |
| wchar_t *prefix; | |
| #ifdef MS_WINDOWS | |
| wchar_t *dll_path; | |
| #else | |
| wchar_t *exec_prefix; | |
| #endif | |
| /* Set by Py_SetPath(), or computed by _PyPathConfig_Init() */ | |
| wchar_t *module_search_path; | |
| /* Python program name */ | |
| wchar_t *program_name; | |
| /* Set by Py_SetPythonHome() or PYTHONHOME environment variable */ | |
| wchar_t *home; | |
| } _PyPathConfig; | |
| #define _PyPathConfig_INIT {.module_search_path = NULL} | |
| /* Note: _PyPathConfig_INIT sets other fields to 0/NULL */ | |
| PyAPI_DATA(_PyPathConfig) _Py_path_config; | |
| PyAPI_FUNC(_PyInitError) _PyPathConfig_Calculate( | |
| _PyPathConfig *config, | |
| const _PyCoreConfig *core_config); | |
| PyAPI_FUNC(void) _PyPathConfig_Clear(_PyPathConfig *config); | |
| /* interpreter state */ | |
| PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_LookUpID(PY_INT64_T); | |
| PyAPI_FUNC(int) _PyInterpreterState_IDInitref(PyInterpreterState *); | |
| PyAPI_FUNC(void) _PyInterpreterState_IDIncref(PyInterpreterState *); | |
| PyAPI_FUNC(void) _PyInterpreterState_IDDecref(PyInterpreterState *); | |
| /* Full Python runtime state */ | |
| typedef struct pyruntimestate { | |
| int initialized; | |
| int core_initialized; | |
| PyThreadState *finalizing; | |
| struct pyinterpreters { | |
| PyThread_type_lock mutex; | |
| PyInterpreterState *head; | |
| PyInterpreterState *main; | |
| /* _next_interp_id is an auto-numbered sequence of small | |
| integers. It gets initialized in _PyInterpreterState_Init(), | |
| which is called in Py_Initialize(), and used in | |
| PyInterpreterState_New(). A negative interpreter ID | |
| indicates an error occurred. The main interpreter will | |
| always have an ID of 0. Overflow results in a RuntimeError. | |
| If that becomes a problem later then we can adjust, e.g. by | |
| using a Python int. */ | |
| int64_t next_id; | |
| } interpreters; | |
| #define NEXITFUNCS 32 | |
| void (*exitfuncs[NEXITFUNCS])(void); | |
| int nexitfuncs; | |
| struct _gc_runtime_state gc; | |
| struct _warnings_runtime_state warnings; | |
| struct _ceval_runtime_state ceval; | |
| struct _gilstate_runtime_state gilstate; | |
| // XXX Consolidate globals found via the check-c-globals script. | |
| } _PyRuntimeState; | |
| #define _PyRuntimeState_INIT {.initialized = 0, .core_initialized = 0} | |
| /* Note: _PyRuntimeState_INIT sets other fields to 0/NULL */ | |
| PyAPI_DATA(_PyRuntimeState) _PyRuntime; | |
| PyAPI_FUNC(_PyInitError) _PyRuntimeState_Init(_PyRuntimeState *); | |
| PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *); | |
| /* Initialize _PyRuntimeState. | |
| Return NULL on success, or return an error message on failure. */ | |
| PyAPI_FUNC(_PyInitError) _PyRuntime_Initialize(void); | |
| #define _Py_CURRENTLY_FINALIZING(tstate) \ | |
| (_PyRuntime.finalizing == tstate) | |
| /* Other */ | |
| PyAPI_FUNC(_PyInitError) _PyInterpreterState_Enable(_PyRuntimeState *); | |
| #ifdef __cplusplus | |
| } | |
| #endif | |
| #endif /* !Py_INTERNAL_PYSTATE_H */ |