/home/mdboom/Work/builds/cpython/Include/internal/pycore_interp.h
Line | Count | Source |
1 | #ifndef Py_INTERNAL_INTERP_H |
2 | #define Py_INTERNAL_INTERP_H |
3 | #ifdef __cplusplus |
4 | extern "C" { |
5 | #endif |
6 | |
7 | #ifndef Py_BUILD_CORE |
8 | # error "this header requires Py_BUILD_CORE define" |
9 | #endif |
10 | |
11 | #include <stdbool.h> |
12 | |
13 | #include "pycore_atomic.h" // _Py_atomic_address |
14 | #include "pycore_ast_state.h" // struct ast_state |
15 | #include "pycore_code.h" // struct callable_cache |
16 | #include "pycore_context.h" // struct _Py_context_state |
17 | #include "pycore_dict.h" // struct _Py_dict_state |
18 | #include "pycore_exceptions.h" // struct _Py_exc_state |
19 | #include "pycore_floatobject.h" // struct _Py_float_state |
20 | #include "pycore_genobject.h" // struct _Py_async_gen_state |
21 | #include "pycore_gil.h" // struct _gil_runtime_state |
22 | #include "pycore_gc.h" // struct _gc_runtime_state |
23 | #include "pycore_list.h" // struct _Py_list_state |
24 | #include "pycore_tuple.h" // struct _Py_tuple_state |
25 | #include "pycore_typeobject.h" // struct type_cache |
26 | #include "pycore_unicodeobject.h" // struct _Py_unicode_state |
27 | #include "pycore_warnings.h" // struct _warnings_runtime_state |
28 | |
29 | struct _pending_calls { |
30 | PyThread_type_lock lock; |
31 | /* Request for running pending calls. */ |
32 | _Py_atomic_int calls_to_do; |
33 | /* Request for looking at the `async_exc` field of the current |
34 | thread state. |
35 | Guarded by the GIL. */ |
36 | int async_exc; |
37 | #define NPENDINGCALLS 32 |
38 | struct { |
39 | int (*func)(void *); |
40 | void *arg; |
41 | } calls[NPENDINGCALLS]; |
42 | int first; |
43 | int last; |
44 | }; |
45 | |
46 | struct _ceval_state { |
47 | int recursion_limit; |
48 | /* This single variable consolidates all requests to break out of |
49 | the fast path in the eval loop. */ |
50 | _Py_atomic_int eval_breaker; |
51 | /* Request for dropping the GIL */ |
52 | _Py_atomic_int gil_drop_request; |
53 | struct _pending_calls pending; |
54 | }; |
55 | |
56 | |
57 | // atexit state |
58 | typedef struct { |
59 | PyObject *func; |
60 | PyObject *args; |
61 | PyObject *kwargs; |
62 | } atexit_callback; |
63 | |
64 | struct atexit_state { |
65 | atexit_callback **callbacks; |
66 | int ncallbacks; |
67 | int callback_len; |
68 | }; |
69 | |
70 | |
71 | /* interpreter state */ |
72 | |
73 | /* PyInterpreterState holds the global state for one of the runtime's |
74 | interpreters. Typically the initial (main) interpreter is the only one. |
75 | |
76 | The PyInterpreterState typedef is in Include/pystate.h. |
77 | */ |
78 | struct _is { |
79 | |
80 | PyInterpreterState *next; |
81 | |
82 | struct pythreads { |
83 | uint64_t next_unique_id; |
84 | /* The linked list of threads, newest first. */ |
85 | PyThreadState *head; |
86 | /* Used in Modules/_threadmodule.c. */ |
87 | long count; |
88 | /* Support for runtime thread stack size tuning. |
89 | A value of 0 means using the platform's default stack size |
90 | or the size specified by the THREAD_STACK_SIZE macro. */ |
91 | /* Used in Python/thread.c. */ |
92 | size_t stacksize; |
93 | } threads; |
94 | |
95 | /* Reference to the _PyRuntime global variable. This field exists |
96 | to not have to pass runtime in addition to tstate to a function. |
97 | Get runtime from tstate: tstate->interp->runtime. */ |
98 | struct pyruntimestate *runtime; |
99 | |
100 | int64_t id; |
101 | int64_t id_refcount; |
102 | int requires_idref; |
103 | PyThread_type_lock id_mutex; |
104 | |
105 | /* Has been initialized to a safe state. |
106 | |
107 | In order to be effective, this must be set to 0 during or right |
108 | after allocation. */ |
109 | int _initialized; |
110 | int finalizing; |
111 | |
112 | /* Was this interpreter statically allocated? */ |
113 | bool _static; |
114 | |
115 | struct _ceval_state ceval; |
116 | struct _gc_runtime_state gc; |
117 | |
118 | // sys.modules dictionary |
119 | PyObject *modules; |
120 | PyObject *modules_by_index; |
121 | // Dictionary of the sys module |
122 | PyObject *sysdict; |
123 | // Dictionary of the builtins module |
124 | PyObject *builtins; |
125 | // importlib module |
126 | PyObject *importlib; |
127 | // override for config->use_frozen_modules (for tests) |
128 | // (-1: "off", 1: "on", 0: no override) |
129 | int override_frozen_modules; |
130 | |
131 | PyObject *codec_search_path; |
132 | PyObject *codec_search_cache; |
133 | PyObject *codec_error_registry; |
134 | int codecs_initialized; |
135 | |
136 | PyConfig config; |
137 | #ifdef HAVE_DLOPEN |
138 | int dlopenflags; |
139 | #endif |
140 | |
141 | PyObject *dict; /* Stores per-interpreter state */ |
142 | |
143 | PyObject *builtins_copy; |
144 | PyObject *import_func; |
145 | // Initialized to _PyEval_EvalFrameDefault(). |
146 | _PyFrameEvalFunction eval_frame; |
147 | |
148 | Py_ssize_t co_extra_user_count; |
149 | freefunc co_extra_freefuncs[MAX_CO_EXTRA_USERS]; |
150 | |
151 | #ifdef HAVE_FORK |
152 | PyObject *before_forkers; |
153 | PyObject *after_forkers_parent; |
154 | PyObject *after_forkers_child; |
155 | #endif |
156 | |
157 | struct _warnings_runtime_state warnings; |
158 | struct atexit_state atexit; |
159 | |
160 | PyObject *audit_hooks; |
161 | |
162 | struct _Py_unicode_state unicode; |
163 | struct _Py_float_state float_state; |
164 | /* Using a cache is very effective since typically only a single slice is |
165 | created and then deleted again. */ |
166 | PySliceObject *slice_cache; |
167 | |
168 | struct _Py_tuple_state tuple; |
169 | struct _Py_list_state list; |
170 | struct _Py_dict_state dict_state; |
171 | struct _Py_async_gen_state async_gen; |
172 | struct _Py_context_state context; |
173 | struct _Py_exc_state exc_state; |
174 | |
175 | struct ast_state ast; |
176 | struct type_cache type_cache; |
177 | struct callable_cache callable_cache; |
178 | |
179 | /* The following fields are here to avoid allocation during init. |
180 | The data is exposed through PyInterpreterState pointer fields. |
181 | These fields should not be accessed directly outside of init. |
182 | |
183 | All other PyInterpreterState pointer fields are populated when |
184 | needed and default to NULL. |
185 | |
186 | For now there are some exceptions to that rule, which require |
187 | allocation during init. These will be addressed on a case-by-case |
188 | basis. Also see _PyRuntimeState regarding the various mutex fields. |
189 | */ |
190 | |
191 | /* the initial PyInterpreterState.threads.head */ |
192 | PyThreadState _initial_thread; |
193 | }; |
194 | |
195 | |
196 | /* other API */ |
197 | |
198 | extern void _PyInterpreterState_ClearModules(PyInterpreterState *interp); |
199 | extern void _PyInterpreterState_Clear(PyThreadState *tstate); |
200 | |
201 | |
202 | /* cross-interpreter data registry */ |
203 | |
204 | /* For now we use a global registry of shareable classes. An |
205 | alternative would be to add a tp_* slot for a class's |
206 | crossinterpdatafunc. It would be simpler and more efficient. */ |
207 | |
208 | struct _xidregitem; |
209 | |
210 | struct _xidregitem { |
211 | PyTypeObject *cls; |
212 | crossinterpdatafunc getdata; |
213 | struct _xidregitem *next; |
214 | }; |
215 | |
216 | PyAPI_FUNC(PyInterpreterState*) _PyInterpreterState_LookUpID(int64_t); |
217 | |
218 | PyAPI_FUNC(int) _PyInterpreterState_IDInitref(PyInterpreterState *); |
219 | PyAPI_FUNC(int) _PyInterpreterState_IDIncref(PyInterpreterState *); |
220 | PyAPI_FUNC(void) _PyInterpreterState_IDDecref(PyInterpreterState *); |
221 | |
222 | #ifdef __cplusplus |
223 | } |
224 | #endif |
225 | #endif /* !Py_INTERNAL_INTERP_H */ |