• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef Py_CPYTHON_PYSTATE_H
2 #  error "this header file must not be included directly"
3 #endif
4 
5 PyAPI_FUNC(int) _PyInterpreterState_RequiresIDRef(PyInterpreterState *);
6 PyAPI_FUNC(void) _PyInterpreterState_RequireIDRef(PyInterpreterState *, int);
7 
8 PyAPI_FUNC(PyObject *) _PyInterpreterState_GetMainModule(PyInterpreterState *);
9 
10 /* State unique per thread */
11 
12 /* Py_tracefunc return -1 when raising an exception, or 0 for success. */
13 typedef int (*Py_tracefunc)(PyObject *, PyFrameObject *, int, PyObject *);
14 
15 /* The following values are used for 'what' for tracefunc functions
16  *
17  * To add a new kind of trace event, also update "trace_init" in
18  * Python/sysmodule.c to define the Python level event name
19  */
20 #define PyTrace_CALL 0
21 #define PyTrace_EXCEPTION 1
22 #define PyTrace_LINE 2
23 #define PyTrace_RETURN 3
24 #define PyTrace_C_CALL 4
25 #define PyTrace_C_EXCEPTION 5
26 #define PyTrace_C_RETURN 6
27 #define PyTrace_OPCODE 7
28 
29 
30 typedef struct _cframe {
31     /* This struct will be threaded through the C stack
32      * allowing fast access to per-thread state that needs
33      * to be accessed quickly by the interpreter, but can
34      * be modified outside of the interpreter.
35      *
36      * WARNING: This makes data on the C stack accessible from
37      * heap objects. Care must be taken to maintain stack
38      * discipline and make sure that instances of this struct cannot
39      * accessed outside of their lifetime.
40      */
41     int use_tracing;
42     struct _cframe *previous;
43 } CFrame;
44 
45 typedef struct _err_stackitem {
46     /* This struct represents an entry on the exception stack, which is a
47      * per-coroutine state. (Coroutine in the computer science sense,
48      * including the thread and generators).
49      * This ensures that the exception state is not impacted by "yields"
50      * from an except handler.
51      */
52     PyObject *exc_type, *exc_value, *exc_traceback;
53 
54     struct _err_stackitem *previous_item;
55 
56 } _PyErr_StackItem;
57 
58 
59 // The PyThreadState typedef is in Include/pystate.h.
60 struct _ts {
61     /* See Python/ceval.c for comments explaining most fields */
62 
63     struct _ts *prev;
64     struct _ts *next;
65     PyInterpreterState *interp;
66 
67     /* Borrowed reference to the current frame (it can be NULL) */
68     PyFrameObject *frame;
69     int recursion_depth;
70     int recursion_headroom; /* Allow 50 more calls to handle any errors. */
71     int stackcheck_counter;
72 
73     /* 'tracing' keeps track of the execution depth when tracing/profiling.
74        This is to prevent the actual trace/profile code from being recorded in
75        the trace/profile. */
76     int tracing;
77 
78     /* Pointer to current CFrame in the C stack frame of the currently,
79      * or most recently, executing _PyEval_EvalFrameDefault. */
80     CFrame *cframe;
81 
82     Py_tracefunc c_profilefunc;
83     Py_tracefunc c_tracefunc;
84     PyObject *c_profileobj;
85     PyObject *c_traceobj;
86 
87     /* The exception currently being raised */
88     PyObject *curexc_type;
89     PyObject *curexc_value;
90     PyObject *curexc_traceback;
91 
92     /* The exception currently being handled, if no coroutines/generators
93      * are present. Always last element on the stack referred to be exc_info.
94      */
95     _PyErr_StackItem exc_state;
96 
97     /* Pointer to the top of the stack of the exceptions currently
98      * being handled */
99     _PyErr_StackItem *exc_info;
100 
101     PyObject *dict;  /* Stores per-thread state */
102 
103     int gilstate_counter;
104 
105     PyObject *async_exc; /* Asynchronous exception to raise */
106     unsigned long thread_id; /* Thread id where this tstate was created */
107 
108     int trash_delete_nesting;
109     PyObject *trash_delete_later;
110 
111     /* Called when a thread state is deleted normally, but not when it
112      * is destroyed after fork().
113      * Pain:  to prevent rare but fatal shutdown errors (issue 18808),
114      * Thread.join() must wait for the join'ed thread's tstate to be unlinked
115      * from the tstate chain.  That happens at the end of a thread's life,
116      * in pystate.c.
117      * The obvious way doesn't quite work:  create a lock which the tstate
118      * unlinking code releases, and have Thread.join() wait to acquire that
119      * lock.  The problem is that we _are_ at the end of the thread's life:
120      * if the thread holds the last reference to the lock, decref'ing the
121      * lock will delete the lock, and that may trigger arbitrary Python code
122      * if there's a weakref, with a callback, to the lock.  But by this time
123      * _PyRuntime.gilstate.tstate_current is already NULL, so only the simplest
124      * of C code can be allowed to run (in particular it must not be possible to
125      * release the GIL).
126      * So instead of holding the lock directly, the tstate holds a weakref to
127      * the lock:  that's the value of on_delete_data below.  Decref'ing a
128      * weakref is harmless.
129      * on_delete points to _threadmodule.c's static release_sentinel() function.
130      * After the tstate is unlinked, release_sentinel is called with the
131      * weakref-to-lock (on_delete_data) argument, and release_sentinel releases
132      * the indirectly held lock.
133      */
134     void (*on_delete)(void *);
135     void *on_delete_data;
136 
137     int coroutine_origin_tracking_depth;
138 
139     PyObject *async_gen_firstiter;
140     PyObject *async_gen_finalizer;
141 
142     PyObject *context;
143     uint64_t context_ver;
144 
145     /* Unique thread state id. */
146     uint64_t id;
147 
148     CFrame root_cframe;
149 
150     /* XXX signal handlers should also be here */
151 
152 };
153 
154 // Alias for backward compatibility with Python 3.8
155 #define _PyInterpreterState_Get PyInterpreterState_Get
156 
157 PyAPI_FUNC(PyThreadState *) _PyThreadState_Prealloc(PyInterpreterState *);
158 
159 /* Similar to PyThreadState_Get(), but don't issue a fatal error
160  * if it is NULL. */
161 PyAPI_FUNC(PyThreadState *) _PyThreadState_UncheckedGet(void);
162 
163 PyAPI_FUNC(PyObject *) _PyThreadState_GetDict(PyThreadState *tstate);
164 
165 /* PyGILState */
166 
167 /* Helper/diagnostic function - return 1 if the current thread
168    currently holds the GIL, 0 otherwise.
169 
170    The function returns 1 if _PyGILState_check_enabled is non-zero. */
171 PyAPI_FUNC(int) PyGILState_Check(void);
172 
173 /* Get the single PyInterpreterState used by this process' GILState
174    implementation.
175 
176    This function doesn't check for error. Return NULL before _PyGILState_Init()
177    is called and after _PyGILState_Fini() is called.
178 
179    See also _PyInterpreterState_Get() and _PyInterpreterState_GET(). */
180 PyAPI_FUNC(PyInterpreterState *) _PyGILState_GetInterpreterStateUnsafe(void);
181 
182 /* The implementation of sys._current_frames()  Returns a dict mapping
183    thread id to that thread's current frame.
184 */
185 PyAPI_FUNC(PyObject *) _PyThread_CurrentFrames(void);
186 
187 /* The implementation of sys._current_exceptions()  Returns a dict mapping
188    thread id to that thread's current exception.
189 */
190 PyAPI_FUNC(PyObject *) _PyThread_CurrentExceptions(void);
191 
192 /* Routines for advanced debuggers, requested by David Beazley.
193    Don't use unless you know what you are doing! */
194 PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Main(void);
195 PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Head(void);
196 PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Next(PyInterpreterState *);
197 PyAPI_FUNC(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *);
198 PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *);
199 PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void);
200 
201 /* Frame evaluation API */
202 
203 typedef PyObject* (*_PyFrameEvalFunction)(PyThreadState *tstate, PyFrameObject *, int);
204 
205 PyAPI_FUNC(_PyFrameEvalFunction) _PyInterpreterState_GetEvalFrameFunc(
206     PyInterpreterState *interp);
207 PyAPI_FUNC(void) _PyInterpreterState_SetEvalFrameFunc(
208     PyInterpreterState *interp,
209     _PyFrameEvalFunction eval_frame);
210 
211 PyAPI_FUNC(const PyConfig*) _PyInterpreterState_GetConfig(PyInterpreterState *interp);
212 
213 /* Get a copy of the current interpreter configuration.
214 
215    Return 0 on success. Raise an exception and return -1 on error.
216 
217    The caller must initialize 'config', using PyConfig_InitPythonConfig()
218    for example.
219 
220    Python must be preinitialized to call this method.
221    The caller must hold the GIL. */
222 PyAPI_FUNC(int) _PyInterpreterState_GetConfigCopy(
223     struct PyConfig *config);
224 
225 /* Set the configuration of the current interpreter.
226 
227    This function should be called during or just after the Python
228    initialization.
229 
230    Update the sys module with the new configuration. If the sys module was
231    modified directly after the Python initialization, these changes are lost.
232 
233    Some configuration like faulthandler or warnoptions can be updated in the
234    configuration, but don't reconfigure Python (don't enable/disable
235    faulthandler and don't reconfigure warnings filters).
236 
237    Return 0 on success. Raise an exception and return -1 on error.
238 
239    The configuration should come from _PyInterpreterState_GetConfigCopy(). */
240 PyAPI_FUNC(int) _PyInterpreterState_SetConfig(
241     const struct PyConfig *config);
242 
243 // Get the configuration of the current interpreter.
244 // The caller must hold the GIL.
245 PyAPI_FUNC(const PyConfig*) _Py_GetConfig(void);
246 
247 
248 /* cross-interpreter data */
249 
250 struct _xid;
251 
252 // _PyCrossInterpreterData is similar to Py_buffer as an effectively
253 // opaque struct that holds data outside the object machinery.  This
254 // is necessary to pass safely between interpreters in the same process.
255 typedef struct _xid {
256     // data is the cross-interpreter-safe derivation of a Python object
257     // (see _PyObject_GetCrossInterpreterData).  It will be NULL if the
258     // new_object func (below) encodes the data.
259     void *data;
260     // obj is the Python object from which the data was derived.  This
261     // is non-NULL only if the data remains bound to the object in some
262     // way, such that the object must be "released" (via a decref) when
263     // the data is released.  In that case the code that sets the field,
264     // likely a registered "crossinterpdatafunc", is responsible for
265     // ensuring it owns the reference (i.e. incref).
266     PyObject *obj;
267     // interp is the ID of the owning interpreter of the original
268     // object.  It corresponds to the active interpreter when
269     // _PyObject_GetCrossInterpreterData() was called.  This should only
270     // be set by the cross-interpreter machinery.
271     //
272     // We use the ID rather than the PyInterpreterState to avoid issues
273     // with deleted interpreters.  Note that IDs are never re-used, so
274     // each one will always correspond to a specific interpreter
275     // (whether still alive or not).
276     int64_t interp;
277     // new_object is a function that returns a new object in the current
278     // interpreter given the data.  The resulting object (a new
279     // reference) will be equivalent to the original object.  This field
280     // is required.
281     PyObject *(*new_object)(struct _xid *);
282     // free is called when the data is released.  If it is NULL then
283     // nothing will be done to free the data.  For some types this is
284     // okay (e.g. bytes) and for those types this field should be set
285     // to NULL.  However, for most the data was allocated just for
286     // cross-interpreter use, so it must be freed when
287     // _PyCrossInterpreterData_Release is called or the memory will
288     // leak.  In that case, at the very least this field should be set
289     // to PyMem_RawFree (the default if not explicitly set to NULL).
290     // The call will happen with the original interpreter activated.
291     void (*free)(void *);
292 } _PyCrossInterpreterData;
293 
294 PyAPI_FUNC(int) _PyObject_GetCrossInterpreterData(PyObject *, _PyCrossInterpreterData *);
295 PyAPI_FUNC(PyObject *) _PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *);
296 PyAPI_FUNC(void) _PyCrossInterpreterData_Release(_PyCrossInterpreterData *);
297 
298 PyAPI_FUNC(int) _PyObject_CheckCrossInterpreterData(PyObject *);
299 
300 /* cross-interpreter data registry */
301 
302 typedef int (*crossinterpdatafunc)(PyObject *, struct _xid *);
303 
304 PyAPI_FUNC(int) _PyCrossInterpreterData_RegisterClass(PyTypeObject *, crossinterpdatafunc);
305 PyAPI_FUNC(crossinterpdatafunc) _PyCrossInterpreterData_Lookup(PyObject *);
306