Coverage Report

Created: 2022-07-08 09:39

/home/mdboom/Work/builds/cpython/Include/internal/pycore_runtime.h
Line
Count
Source
1
#ifndef Py_INTERNAL_RUNTIME_H
2
#define Py_INTERNAL_RUNTIME_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 "pycore_atomic.h"          /* _Py_atomic_address */
12
#include "pycore_gil.h"             // struct _gil_runtime_state
13
#include "pycore_global_objects.h"  // struct _Py_global_objects
14
#include "pycore_interp.h"          // PyInterpreterState
15
#include "pycore_unicodeobject.h"   // struct _Py_unicode_runtime_ids
16
17
18
/* ceval state */
19
20
struct _ceval_runtime_state {
21
    /* Request for checking signals. It is shared by all interpreters (see
22
       bpo-40513). Any thread of any interpreter can receive a signal, but only
23
       the main thread of the main interpreter can handle signals: see
24
       _Py_ThreadCanHandleSignals(). */
25
    _Py_atomic_int signals_pending;
26
    struct _gil_runtime_state gil;
27
};
28
29
/* GIL state */
30
31
struct _gilstate_runtime_state {
32
    /* bpo-26558: Flag to disable PyGILState_Check().
33
       If set to non-zero, PyGILState_Check() always return 1. */
34
    int check_enabled;
35
    /* Assuming the current thread holds the GIL, this is the
36
       PyThreadState for the current thread. */
37
    _Py_atomic_address tstate_current;
38
    /* The single PyInterpreterState used by this process'
39
       GILState implementation
40
    */
41
    /* TODO: Given interp_main, it may be possible to kill this ref */
42
    PyInterpreterState *autoInterpreterState;
43
    Py_tss_t autoTSSkey;
44
};
45
46
/* Runtime audit hook state */
47
48
typedef struct _Py_AuditHookEntry {
49
    struct _Py_AuditHookEntry *next;
50
    Py_AuditHookFunction hookCFunction;
51
    void *userData;
52
} _Py_AuditHookEntry;
53
54
/* Full Python runtime state */
55
56
/* _PyRuntimeState holds the global state for the CPython runtime.
57
   That data is exposed in the internal API as a static variable (_PyRuntime).
58
   */
59
typedef struct pyruntimestate {
60
    /* Has been initialized to a safe state.
61
62
       In order to be effective, this must be set to 0 during or right
63
       after allocation. */
64
    int _initialized;
65
66
    /* Is running Py_PreInitialize()? */
67
    int preinitializing;
68
69
    /* Is Python preinitialized? Set to 1 by Py_PreInitialize() */
70
    int preinitialized;
71
72
    /* Is Python core initialized? Set to 1 by _Py_InitializeCore() */
73
    int core_initialized;
74
75
    /* Is Python fully initialized? Set to 1 by Py_Initialize() */
76
    int initialized;
77
78
    /* Set by Py_FinalizeEx(). Only reset to NULL if Py_Initialize()
79
       is called again.
80
81
       Use _PyRuntimeState_GetFinalizing() and _PyRuntimeState_SetFinalizing()
82
       to access it, don't access it directly. */
83
    _Py_atomic_address _finalizing;
84
85
    struct pyinterpreters {
86
        PyThread_type_lock mutex;
87
        /* The linked list of interpreters, newest first. */
88
        PyInterpreterState *head;
89
        /* The runtime's initial interpreter, which has a special role
90
           in the operation of the runtime.  It is also often the only
91
           interpreter. */
92
        PyInterpreterState *main;
93
        /* _next_interp_id is an auto-numbered sequence of small
94
           integers.  It gets initialized in _PyInterpreterState_Init(),
95
           which is called in Py_Initialize(), and used in
96
           PyInterpreterState_New().  A negative interpreter ID
97
           indicates an error occurred.  The main interpreter will
98
           always have an ID of 0.  Overflow results in a RuntimeError.
99
           If that becomes a problem later then we can adjust, e.g. by
100
           using a Python int. */
101
        int64_t next_id;
102
    } interpreters;
103
    // XXX Remove this field once we have a tp_* slot.
104
    struct _xidregistry {
105
        PyThread_type_lock mutex;
106
        struct _xidregitem *head;
107
    } xidregistry;
108
109
    unsigned long main_thread;
110
111
#define NEXITFUNCS 32
112
    void (*exitfuncs[NEXITFUNCS])(void);
113
    int nexitfuncs;
114
115
    struct _ceval_runtime_state ceval;
116
    struct _gilstate_runtime_state gilstate;
117
118
    PyPreConfig preconfig;
119
120
    // Audit values must be preserved when Py_Initialize()/Py_Finalize()
121
    // is called multiple times.
122
    Py_OpenCodeHookFunction open_code_hook;
123
    void *open_code_userdata;
124
    _Py_AuditHookEntry *audit_hook_head;
125
126
    struct _Py_unicode_runtime_ids unicode_ids;
127
128
    /* All the objects that are shared by the runtime's interpreters. */
129
    struct _Py_global_objects global_objects;
130
131
    /* The following fields are here to avoid allocation during init.
132
       The data is exposed through _PyRuntimeState pointer fields.
133
       These fields should not be accessed directly outside of init.
134
135
       All other _PyRuntimeState pointer fields are populated when
136
       needed and default to NULL.
137
138
       For now there are some exceptions to that rule, which require
139
       allocation during init.  These will be addressed on a case-by-case
140
       basis.  Most notably, we don't pre-allocated the several mutex
141
       (PyThread_type_lock) fields, because on Windows we only ever get
142
       a pointer type.
143
       */
144
145
    /* PyInterpreterState.interpreters.main */
146
    PyInterpreterState _main_interpreter;
147
} _PyRuntimeState;
148
149
150
/* other API */
151
152
PyAPI_DATA(_PyRuntimeState) _PyRuntime;
153
154
PyAPI_FUNC(PyStatus) _PyRuntimeState_Init(_PyRuntimeState *runtime);
155
PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *runtime);
156
157
#ifdef HAVE_FORK
158
extern PyStatus _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime);
159
#endif
160
161
/* Initialize _PyRuntimeState.
162
   Return NULL on success, or return an error message on failure. */
163
PyAPI_FUNC(PyStatus) _PyRuntime_Initialize(void);
164
165
PyAPI_FUNC(void) _PyRuntime_Finalize(void);
166
167
168
static inline PyThreadState*
169
_PyRuntimeState_GetFinalizing(_PyRuntimeState *runtime) {
170
    return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->_finalizing);
171
}
Unexecuted instantiation: myreadline.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: tokenizer.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: abstract.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: boolobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: bytearrayobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: bytesobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: call.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: cellobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: classobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: codeobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: complexobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: descrobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: enumobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: exceptions.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: genericaliasobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: genobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: fileobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: floatobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: frameobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: funcobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: iterobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: listobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: longobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: dictobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: odictobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: memoryobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: methodobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: moduleobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: object.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: rangeobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: setobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: sliceobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: structseq.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: tupleobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: typeobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: unicodeobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: unionobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: weakrefobject.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: _warnings.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: Python-ast.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: ast.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: ast_opt.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: ast_unparse.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: bltinmodule.c:_PyRuntimeState_GetFinalizing
ceval.c:_PyRuntimeState_GetFinalizing
Line
Count
Source
169
_PyRuntimeState_GetFinalizing(_PyRuntimeState *runtime) {
170
    return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->_finalizing);
171
}
Unexecuted instantiation: codecs.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: compile.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: context.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: errors.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: frame.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: frozenmain.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: getargs.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: hamt.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: import.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: importdl.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: initconfig.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: marshal.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: mystrtoul.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: preconfig.c:_PyRuntimeState_GetFinalizing
pylifecycle.c:_PyRuntimeState_GetFinalizing
Line
Count
Source
169
_PyRuntimeState_GetFinalizing(_PyRuntimeState *runtime) {
170
    return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->_finalizing);
171
}
Unexecuted instantiation: pystate.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: pythonrun.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: specialize.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: symtable.c:_PyRuntimeState_GetFinalizing
sysmodule.c:_PyRuntimeState_GetFinalizing
Line
Count
Source
169
_PyRuntimeState_GetFinalizing(_PyRuntimeState *runtime) {
170
    return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->_finalizing);
171
}
Unexecuted instantiation: thread.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: traceback.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: formatter_unicode.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: fileutils.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: dynload_shlib.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: main.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: gcmodule.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: atexitmodule.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: faulthandler.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: posixmodule.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: signalmodule.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: _tracemalloc.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: _collectionsmodule.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: _iomodule.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: iobase.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: fileio.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: bytesio.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: bufferedio.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: textio.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: stringio.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: itertoolsmodule.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: sre.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: _threadmodule.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: timemodule.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: _weakref.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: _abc.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: _functoolsmodule.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: _operator.c:_PyRuntimeState_GetFinalizing
Unexecuted instantiation: deepfreeze.c:_PyRuntimeState_GetFinalizing
172
173
static inline void
174
_PyRuntimeState_SetFinalizing(_PyRuntimeState *runtime, PyThreadState *tstate) {
175
    _Py_atomic_store_relaxed(&runtime->_finalizing, (uintptr_t)tstate);
176
}
Unexecuted instantiation: myreadline.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: tokenizer.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: abstract.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: boolobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: bytearrayobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: bytesobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: call.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: cellobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: classobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: codeobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: complexobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: descrobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: enumobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: exceptions.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: genericaliasobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: genobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: fileobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: floatobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: frameobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: funcobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: iterobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: listobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: longobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: dictobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: odictobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: memoryobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: methodobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: moduleobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: object.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: rangeobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: setobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: sliceobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: structseq.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: tupleobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: typeobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: unicodeobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: unionobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: weakrefobject.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: _warnings.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: Python-ast.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: ast.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: ast_opt.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: ast_unparse.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: bltinmodule.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: ceval.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: codecs.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: compile.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: context.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: errors.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: frame.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: frozenmain.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: getargs.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: hamt.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: import.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: importdl.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: initconfig.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: marshal.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: mystrtoul.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: preconfig.c:_PyRuntimeState_SetFinalizing
pylifecycle.c:_PyRuntimeState_SetFinalizing
Line
Count
Source
174
_PyRuntimeState_SetFinalizing(_PyRuntimeState *runtime, PyThreadState *tstate) {
175
    _Py_atomic_store_relaxed(&runtime->_finalizing, (uintptr_t)tstate);
176
}
Unexecuted instantiation: pystate.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: pythonrun.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: specialize.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: symtable.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: sysmodule.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: thread.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: traceback.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: formatter_unicode.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: fileutils.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: dynload_shlib.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: main.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: gcmodule.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: atexitmodule.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: faulthandler.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: posixmodule.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: signalmodule.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: _tracemalloc.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: _collectionsmodule.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: _iomodule.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: iobase.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: fileio.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: bytesio.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: bufferedio.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: textio.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: stringio.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: itertoolsmodule.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: sre.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: _threadmodule.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: timemodule.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: _weakref.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: _abc.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: _functoolsmodule.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: _operator.c:_PyRuntimeState_SetFinalizing
Unexecuted instantiation: deepfreeze.c:_PyRuntimeState_SetFinalizing
177
178
#ifdef __cplusplus
179
}
180
#endif
181
#endif /* !Py_INTERNAL_RUNTIME_H */