| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- #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);
- PyAPI_FUNC(void) _PyRuntime_Finalize(void);
- #define _Py_CURRENTLY_FINALIZING(tstate) \
- (_PyRuntime.finalizing == tstate)
- /* Other */
- PyAPI_FUNC(_PyInitError) _PyInterpreterState_Enable(_PyRuntimeState *);
- #ifdef __cplusplus
- }
- #endif
- #endif /* !Py_INTERNAL_PYSTATE_H */
|