1 #ifndef Py_INTERNAL_PYSTATE_H 2 #define Py_INTERNAL_PYSTATE_H 3 #ifdef __cplusplus 4 extern "C" { 5 #endif 6 7 #include "pystate.h" 8 #include "pyatomic.h" 9 #include "pythread.h" 10 11 #include "internal/mem.h" 12 #include "internal/ceval.h" 13 #include "internal/warnings.h" 14 15 16 /* GIL state */ 17 18 struct _gilstate_runtime_state { 19 int check_enabled; 20 /* Assuming the current thread holds the GIL, this is the 21 PyThreadState for the current thread. */ 22 _Py_atomic_address tstate_current; 23 PyThreadFrameGetter getframe; 24 /* The single PyInterpreterState used by this process' 25 GILState implementation 26 */ 27 /* TODO: Given interp_main, it may be possible to kill this ref */ 28 PyInterpreterState *autoInterpreterState; 29 Py_tss_t autoTSSkey; 30 }; 31 32 /* hook for PyEval_GetFrame(), requested for Psyco */ 33 #define _PyThreadState_GetFrame _PyRuntime.gilstate.getframe 34 35 /* Issue #26558: Flag to disable PyGILState_Check(). 36 If set to non-zero, PyGILState_Check() always return 1. */ 37 #define _PyGILState_check_enabled _PyRuntime.gilstate.check_enabled 38 39 40 typedef struct { 41 /* Full path to the Python program */ 42 wchar_t *program_full_path; 43 wchar_t *prefix; 44 #ifdef MS_WINDOWS 45 wchar_t *dll_path; 46 #else 47 wchar_t *exec_prefix; 48 #endif 49 /* Set by Py_SetPath(), or computed by _PyPathConfig_Init() */ 50 wchar_t *module_search_path; 51 /* Python program name */ 52 wchar_t *program_name; 53 /* Set by Py_SetPythonHome() or PYTHONHOME environment variable */ 54 wchar_t *home; 55 } _PyPathConfig; 56 57 #define _PyPathConfig_INIT {.module_search_path = NULL} 58 /* Note: _PyPathConfig_INIT sets other fields to 0/NULL */ 59 60 PyAPI_DATA(_PyPathConfig) _Py_path_config; 61 62 PyAPI_FUNC(_PyInitError) _PyPathConfig_Calculate( 63 _PyPathConfig *config, 64 const _PyCoreConfig *core_config); 65 PyAPI_FUNC(void) _PyPathConfig_Clear(_PyPathConfig *config); 66 67 68 /* interpreter state */ 69 70 PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_LookUpID(PY_INT64_T); 71 72 PyAPI_FUNC(int) _PyInterpreterState_IDInitref(PyInterpreterState *); 73 PyAPI_FUNC(void) _PyInterpreterState_IDIncref(PyInterpreterState *); 74 PyAPI_FUNC(void) _PyInterpreterState_IDDecref(PyInterpreterState *); 75 76 /* Full Python runtime state */ 77 78 typedef struct pyruntimestate { 79 int initialized; 80 int core_initialized; 81 PyThreadState *finalizing; 82 83 struct pyinterpreters { 84 PyThread_type_lock mutex; 85 PyInterpreterState *head; 86 PyInterpreterState *main; 87 /* _next_interp_id is an auto-numbered sequence of small 88 integers. It gets initialized in _PyInterpreterState_Init(), 89 which is called in Py_Initialize(), and used in 90 PyInterpreterState_New(). A negative interpreter ID 91 indicates an error occurred. The main interpreter will 92 always have an ID of 0. Overflow results in a RuntimeError. 93 If that becomes a problem later then we can adjust, e.g. by 94 using a Python int. */ 95 int64_t next_id; 96 } interpreters; 97 98 #define NEXITFUNCS 32 99 void (*exitfuncs[NEXITFUNCS])(void); 100 int nexitfuncs; 101 102 struct _gc_runtime_state gc; 103 struct _warnings_runtime_state warnings; 104 struct _ceval_runtime_state ceval; 105 struct _gilstate_runtime_state gilstate; 106 107 // XXX Consolidate globals found via the check-c-globals script. 108 } _PyRuntimeState; 109 110 #define _PyRuntimeState_INIT {.initialized = 0, .core_initialized = 0} 111 /* Note: _PyRuntimeState_INIT sets other fields to 0/NULL */ 112 113 PyAPI_DATA(_PyRuntimeState) _PyRuntime; 114 PyAPI_FUNC(_PyInitError) _PyRuntimeState_Init(_PyRuntimeState *); 115 PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *); 116 117 /* Initialize _PyRuntimeState. 118 Return NULL on success, or return an error message on failure. */ 119 PyAPI_FUNC(_PyInitError) _PyRuntime_Initialize(void); 120 121 #define _Py_CURRENTLY_FINALIZING(tstate) \ 122 (_PyRuntime.finalizing == tstate) 123 124 125 /* Other */ 126 127 PyAPI_FUNC(_PyInitError) _PyInterpreterState_Enable(_PyRuntimeState *); 128 129 #ifdef __cplusplus 130 } 131 #endif 132 #endif /* !Py_INTERNAL_PYSTATE_H */ 133