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 PyAPI_FUNC(void) _PyRuntime_Finalize(void);
122 
123 
124 #define _Py_CURRENTLY_FINALIZING(tstate) \
125     (_PyRuntime.finalizing == tstate)
126 
127 
128 /* Other */
129 
130 PyAPI_FUNC(_PyInitError) _PyInterpreterState_Enable(_PyRuntimeState *);
131 
132 #ifdef __cplusplus
133 }
134 #endif
135 #endif /* !Py_INTERNAL_PYSTATE_H */
136