Coverage Report

Created: 2025-08-26 06:26

/src/cpython-install/include/python3.15/cpython/pystate.h
Line
Count
Source (jump to first uncovered line)
1
#ifndef Py_CPYTHON_PYSTATE_H
2
#  error "this header file must not be included directly"
3
#endif
4
5
6
/* private interpreter helpers */
7
8
PyAPI_FUNC(int) _PyInterpreterState_RequiresIDRef(PyInterpreterState *);
9
PyAPI_FUNC(void) _PyInterpreterState_RequireIDRef(PyInterpreterState *, int);
10
11
/* State unique per thread */
12
13
/* Py_tracefunc return -1 when raising an exception, or 0 for success. */
14
typedef int (*Py_tracefunc)(PyObject *, PyFrameObject *, int, PyObject *);
15
16
/* The following values are used for 'what' for tracefunc functions
17
 *
18
 * To add a new kind of trace event, also update "trace_init" in
19
 * Python/sysmodule.c to define the Python level event name
20
 */
21
#define PyTrace_CALL 0
22
#define PyTrace_EXCEPTION 1
23
#define PyTrace_LINE 2
24
#define PyTrace_RETURN 3
25
#define PyTrace_C_CALL 4
26
#define PyTrace_C_EXCEPTION 5
27
#define PyTrace_C_RETURN 6
28
#define PyTrace_OPCODE 7
29
30
/* Remote debugger support */
31
#define Py_MAX_SCRIPT_PATH_SIZE 512
32
typedef struct {
33
    int32_t debugger_pending_call;
34
    char debugger_script_path[Py_MAX_SCRIPT_PATH_SIZE];
35
} _PyRemoteDebuggerSupport;
36
37
typedef struct _err_stackitem {
38
    /* This struct represents a single execution context where we might
39
     * be currently handling an exception.  It is a per-coroutine state
40
     * (coroutine in the computer science sense, including the thread
41
     * and generators).
42
     *
43
     * This is used as an entry on the exception stack, where each
44
     * entry indicates if it is currently handling an exception.
45
     * This ensures that the exception state is not impacted
46
     * by "yields" from an except handler.  The thread
47
     * always has an entry (the bottom-most one).
48
     */
49
50
    /* The exception currently being handled in this context, if any. */
51
    PyObject *exc_value;
52
53
    struct _err_stackitem *previous_item;
54
55
} _PyErr_StackItem;
56
57
typedef struct _stack_chunk {
58
    struct _stack_chunk *previous;
59
    size_t size;
60
    size_t top;
61
    PyObject * data[1]; /* Variable sized */
62
} _PyStackChunk;
63
64
/* Minimum size of data stack chunk */
65
#define _PY_DATA_STACK_CHUNK_SIZE (16*1024)
66
struct _ts {
67
    /* See Python/ceval.c for comments explaining most fields */
68
69
    PyThreadState *prev;
70
    PyThreadState *next;
71
    PyInterpreterState *interp;
72
73
    /* The global instrumentation version in high bits, plus flags indicating
74
       when to break out of the interpreter loop in lower bits. See details in
75
       pycore_ceval.h. */
76
    uintptr_t eval_breaker;
77
78
    struct {
79
        /* Has been initialized to a safe state.
80
81
           In order to be effective, this must be set to 0 during or right
82
           after allocation. */
83
        unsigned int initialized:1;
84
85
        /* Has been bound to an OS thread. */
86
        unsigned int bound:1;
87
        /* Has been unbound from its OS thread. */
88
        unsigned int unbound:1;
89
        /* Has been bound aa current for the GILState API. */
90
        unsigned int bound_gilstate:1;
91
        /* Currently in use (maybe holds the GIL). */
92
        unsigned int active:1;
93
94
        /* various stages of finalization */
95
        unsigned int finalizing:1;
96
        unsigned int cleared:1;
97
        unsigned int finalized:1;
98
99
        /* padding to align to 4 bytes */
100
        unsigned int :24;
101
    } _status;
102
#ifdef Py_BUILD_CORE
103
#  define _PyThreadState_WHENCE_NOTSET -1
104
#  define _PyThreadState_WHENCE_UNKNOWN 0
105
#  define _PyThreadState_WHENCE_INIT 1
106
#  define _PyThreadState_WHENCE_FINI 2
107
#  define _PyThreadState_WHENCE_THREADING 3
108
#  define _PyThreadState_WHENCE_GILSTATE 4
109
#  define _PyThreadState_WHENCE_EXEC 5
110
#endif
111
112
    /* Currently holds the GIL. Must be its own field to avoid data races */
113
    int holds_gil;
114
115
    int _whence;
116
117
    /* Thread state (_Py_THREAD_ATTACHED, _Py_THREAD_DETACHED, _Py_THREAD_SUSPENDED).
118
       See Include/internal/pycore_pystate.h for more details. */
119
    int state;
120
121
    int py_recursion_remaining;
122
    int py_recursion_limit;
123
    int recursion_headroom; /* Allow 50 more calls to handle any errors. */
124
125
    /* 'tracing' keeps track of the execution depth when tracing/profiling.
126
       This is to prevent the actual trace/profile code from being recorded in
127
       the trace/profile. */
128
    int tracing;
129
    int what_event; /* The event currently being monitored, if any. */
130
131
    /* Pointer to currently executing frame. */
132
    struct _PyInterpreterFrame *current_frame;
133
134
    Py_tracefunc c_profilefunc;
135
    Py_tracefunc c_tracefunc;
136
    PyObject *c_profileobj;
137
    PyObject *c_traceobj;
138
139
    /* The exception currently being raised */
140
    PyObject *current_exception;
141
142
    /* Pointer to the top of the exception stack for the exceptions
143
     * we may be currently handling.  (See _PyErr_StackItem above.)
144
     * This is never NULL. */
145
    _PyErr_StackItem *exc_info;
146
147
    PyObject *dict;  /* Stores per-thread state */
148
149
    int gilstate_counter;
150
151
    PyObject *async_exc; /* Asynchronous exception to raise */
152
    unsigned long thread_id; /* Thread id where this tstate was created */
153
154
    /* Native thread id where this tstate was created. This will be 0 except on
155
     * those platforms that have the notion of native thread id, for which the
156
     * macro PY_HAVE_THREAD_NATIVE_ID is then defined.
157
     */
158
    unsigned long native_thread_id;
159
160
    PyObject *delete_later;
161
162
    /* Tagged pointer to top-most critical section, or zero if there is no
163
     * active critical section. Critical sections are only used in
164
     * `--disable-gil` builds (i.e., when Py_GIL_DISABLED is defined to 1). In the
165
     * default build, this field is always zero.
166
     */
167
    uintptr_t critical_section;
168
169
    int coroutine_origin_tracking_depth;
170
171
    PyObject *async_gen_firstiter;
172
    PyObject *async_gen_finalizer;
173
174
    PyObject *context;
175
    uint64_t context_ver;
176
177
    /* Unique thread state id. */
178
    uint64_t id;
179
180
    _PyStackChunk *datastack_chunk;
181
    PyObject **datastack_top;
182
    PyObject **datastack_limit;
183
    /* XXX signal handlers should also be here */
184
185
    /* The following fields are here to avoid allocation during init.
186
       The data is exposed through PyThreadState pointer fields.
187
       These fields should not be accessed directly outside of init.
188
       This is indicated by an underscore prefix on the field names.
189
190
       All other PyInterpreterState pointer fields are populated when
191
       needed and default to NULL.
192
       */
193
       // Note some fields do not have a leading underscore for backward
194
       // compatibility.  See https://bugs.python.org/issue45953#msg412046.
195
196
    /* The thread's exception stack entry.  (Always the last entry.) */
197
    _PyErr_StackItem exc_state;
198
199
    PyObject *current_executor;
200
201
    /* Internal to the JIT */
202
    struct _PyExitData *jit_exit;
203
204
    uint64_t dict_global_version;
205
206
    /* Used to store/retrieve `threading.local` keys/values for this thread */
207
    PyObject *threading_local_key;
208
209
    /* Used by `threading.local`s to be remove keys/values for dying threads.
210
       The PyThreadObject must hold the only reference to this value.
211
    */
212
    PyObject *threading_local_sentinel;
213
    _PyRemoteDebuggerSupport remote_debugger_support;
214
};
215
216
/* other API */
217
218
/* Similar to PyThreadState_Get(), but don't issue a fatal error
219
 * if it is NULL. */
220
PyAPI_FUNC(PyThreadState *) PyThreadState_GetUnchecked(void);
221
222
// Deprecated alias kept for backward compatibility
223
Py_DEPRECATED(3.14) static inline PyThreadState*
224
_PyThreadState_UncheckedGet(void)
225
0
{
226
0
    return PyThreadState_GetUnchecked();
227
0
}
228
229
// Disable tracing and profiling.
230
PyAPI_FUNC(void) PyThreadState_EnterTracing(PyThreadState *tstate);
231
232
// Reset tracing and profiling: enable them if a trace function or a profile
233
// function is set, otherwise disable them.
234
PyAPI_FUNC(void) PyThreadState_LeaveTracing(PyThreadState *tstate);
235
236
/* PyGILState */
237
238
/* Helper/diagnostic function - return 1 if the current thread
239
   currently holds the GIL, 0 otherwise.
240
241
   The function returns 1 if _PyGILState_check_enabled is non-zero. */
242
PyAPI_FUNC(int) PyGILState_Check(void);
243
244
/* The implementation of sys._current_frames()  Returns a dict mapping
245
   thread id to that thread's current frame.
246
*/
247
PyAPI_FUNC(PyObject*) _PyThread_CurrentFrames(void);
248
249
/* Routines for advanced debuggers, requested by David Beazley.
250
   Don't use unless you know what you are doing! */
251
PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Main(void);
252
PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Head(void);
253
PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Next(PyInterpreterState *);
254
PyAPI_FUNC(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *);
255
PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *);
256
PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void);
257
258
/* Frame evaluation API */
259
260
typedef PyObject* (*_PyFrameEvalFunction)(PyThreadState *tstate, struct _PyInterpreterFrame *, int);
261
262
PyAPI_FUNC(_PyFrameEvalFunction) _PyInterpreterState_GetEvalFrameFunc(
263
    PyInterpreterState *interp);
264
PyAPI_FUNC(void) _PyInterpreterState_SetEvalFrameFunc(
265
    PyInterpreterState *interp,
266
    _PyFrameEvalFunction eval_frame);