Coverage Report

Created: 2025-11-11 06:44

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/cpython-install/include/python3.15/cpython/pystate.h
Line
Count
Source
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
#  define _PyThreadState_WHENCE_THREADING_DAEMON 6
111
#endif
112
113
    /* Currently holds the GIL. Must be its own field to avoid data races */
114
    int holds_gil;
115
116
    int _whence;
117
118
    /* Thread state (_Py_THREAD_ATTACHED, _Py_THREAD_DETACHED, _Py_THREAD_SUSPENDED).
119
       See Include/internal/pycore_pystate.h for more details. */
120
    int state;
121
122
    int py_recursion_remaining;
123
    int py_recursion_limit;
124
    int recursion_headroom; /* Allow 50 more calls to handle any errors. */
125
126
    /* 'tracing' keeps track of the execution depth when tracing/profiling.
127
       This is to prevent the actual trace/profile code from being recorded in
128
       the trace/profile. */
129
    int tracing;
130
    int what_event; /* The event currently being monitored, if any. */
131
132
    /* Pointer to currently executing frame. */
133
    struct _PyInterpreterFrame *current_frame;
134
135
    Py_tracefunc c_profilefunc;
136
    Py_tracefunc c_tracefunc;
137
    PyObject *c_profileobj;
138
    PyObject *c_traceobj;
139
140
    /* The exception currently being raised */
141
    PyObject *current_exception;
142
143
    /* Pointer to the top of the exception stack for the exceptions
144
     * we may be currently handling.  (See _PyErr_StackItem above.)
145
     * This is never NULL. */
146
    _PyErr_StackItem *exc_info;
147
148
    PyObject *dict;  /* Stores per-thread state */
149
150
    int gilstate_counter;
151
152
    PyObject *async_exc; /* Asynchronous exception to raise */
153
    unsigned long thread_id; /* Thread id where this tstate was created */
154
155
    /* Native thread id where this tstate was created. This will be 0 except on
156
     * those platforms that have the notion of native thread id, for which the
157
     * macro PY_HAVE_THREAD_NATIVE_ID is then defined.
158
     */
159
    unsigned long native_thread_id;
160
161
    /* List of objects that still need to be cleaned up, singly linked
162
     * via their gc headers' gc_next pointers. The list is populated by
163
     * _PyTrash_thread_deposit_object and cleaned up by
164
     * _PyTrash_thread_destroy_chain.
165
     */
166
    PyObject *delete_later;
167
168
    /* Tagged pointer to top-most critical section, or zero if there is no
169
     * active critical section. Critical sections are only used in
170
     * `--disable-gil` builds (i.e., when Py_GIL_DISABLED is defined to 1). In the
171
     * default build, this field is always zero.
172
     */
173
    uintptr_t critical_section;
174
175
    int coroutine_origin_tracking_depth;
176
177
    PyObject *async_gen_firstiter;
178
    PyObject *async_gen_finalizer;
179
180
    PyObject *context;
181
    uint64_t context_ver;
182
183
    /* Unique thread state id. */
184
    uint64_t id;
185
186
    _PyStackChunk *datastack_chunk;
187
    PyObject **datastack_top;
188
    PyObject **datastack_limit;
189
    /* XXX signal handlers should also be here */
190
191
    /* The following fields are here to avoid allocation during init.
192
       The data is exposed through PyThreadState pointer fields.
193
       These fields should not be accessed directly outside of init.
194
       This is indicated by an underscore prefix on the field names.
195
196
       All other PyInterpreterState pointer fields are populated when
197
       needed and default to NULL.
198
       */
199
       // Note some fields do not have a leading underscore for backward
200
       // compatibility.  See https://bugs.python.org/issue45953#msg412046.
201
202
    /* The thread's exception stack entry.  (Always the last entry.) */
203
    _PyErr_StackItem exc_state;
204
205
    PyObject *current_executor;
206
207
    /* Internal to the JIT */
208
    struct _PyExitData *jit_exit;
209
210
    uint64_t dict_global_version;
211
212
    /* Used to store/retrieve `threading.local` keys/values for this thread */
213
    PyObject *threading_local_key;
214
215
    /* Used by `threading.local`s to be remove keys/values for dying threads.
216
       The PyThreadObject must hold the only reference to this value.
217
    */
218
    PyObject *threading_local_sentinel;
219
    _PyRemoteDebuggerSupport remote_debugger_support;
220
221
#ifdef Py_STATS
222
    // Pointer to PyStats structure, NULL if recording is off.  For the
223
    // free-threaded build, the structure is per-thread (stored as a pointer
224
    // in _PyThreadStateImpl).  For the default build, the structure is stored
225
    // in the PyInterpreterState structure (threads do not have their own
226
    // structure and all share the same per-interpreter structure).
227
    PyStats *pystats;
228
#endif
229
};
230
231
/* other API */
232
233
/* Similar to PyThreadState_Get(), but don't issue a fatal error
234
 * if it is NULL. */
235
PyAPI_FUNC(PyThreadState *) PyThreadState_GetUnchecked(void);
236
237
// Deprecated alias kept for backward compatibility
238
Py_DEPRECATED(3.14) static inline PyThreadState*
239
_PyThreadState_UncheckedGet(void)
240
0
{
241
0
    return PyThreadState_GetUnchecked();
242
0
}
243
244
// Disable tracing and profiling.
245
PyAPI_FUNC(void) PyThreadState_EnterTracing(PyThreadState *tstate);
246
247
// Reset tracing and profiling: enable them if a trace function or a profile
248
// function is set, otherwise disable them.
249
PyAPI_FUNC(void) PyThreadState_LeaveTracing(PyThreadState *tstate);
250
251
#ifdef Py_STATS
252
#if defined(HAVE_THREAD_LOCAL) && !defined(Py_BUILD_CORE_MODULE)
253
extern _Py_thread_local PyThreadState *_Py_tss_tstate;
254
255
static inline PyStats*
256
_PyThreadState_GetStatsFast(void)
257
{
258
    if (_Py_tss_tstate == NULL) {
259
        return NULL; // no attached thread state
260
    }
261
    return _Py_tss_tstate->pystats;
262
}
263
#endif
264
#endif // Py_STATS
265
266
/* PyGILState */
267
268
/* Helper/diagnostic function - return 1 if the current thread
269
   currently holds the GIL, 0 otherwise.
270
271
   The function returns 1 if _PyGILState_check_enabled is non-zero. */
272
PyAPI_FUNC(int) PyGILState_Check(void);
273
274
/* The implementation of sys._current_frames()  Returns a dict mapping
275
   thread id to that thread's current frame.
276
*/
277
PyAPI_FUNC(PyObject*) _PyThread_CurrentFrames(void);
278
279
/* Routines for advanced debuggers, requested by David Beazley.
280
   Don't use unless you know what you are doing! */
281
PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Main(void);
282
PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Head(void);
283
PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Next(PyInterpreterState *);
284
PyAPI_FUNC(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *);
285
PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *);
286
PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void);
287
288
/* Frame evaluation API */
289
290
typedef PyObject* (*_PyFrameEvalFunction)(PyThreadState *tstate, struct _PyInterpreterFrame *, int);
291
292
PyAPI_FUNC(_PyFrameEvalFunction) _PyInterpreterState_GetEvalFrameFunc(
293
    PyInterpreterState *interp);
294
PyAPI_FUNC(void) _PyInterpreterState_SetEvalFrameFunc(
295
    PyInterpreterState *interp,
296
    _PyFrameEvalFunction eval_frame);