Skip to content

Commit bcb094b

Browse files
authored
bpo-43268: Pass interp rather than tstate to internal functions (pythonGH-24580)
Pass the current interpreter (interp) rather than the current Python thread state (tstate) to internal functions which only use the interpreter. Modified functions: * _PyXXX_Fini() and _PyXXX_ClearFreeList() functions * _PyEval_SignalAsyncExc(), make_pending_calls() * _PySys_GetObject(), sys_set_object(), sys_set_object_id(), sys_set_object_str() * should_audit(), set_flags_from_config(), make_flags() * _PyAtExit_Call() * init_stdio_encoding() * etc.
1 parent a486054 commit bcb094b

29 files changed

+240
-245
lines changed

Include/internal/pycore_ceval.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ PyAPI_FUNC(int) _PyEval_AddPendingCall(
2323
PyInterpreterState *interp,
2424
int (*func)(void *),
2525
void *arg);
26-
PyAPI_FUNC(void) _PyEval_SignalAsyncExc(PyThreadState *tstate);
26+
PyAPI_FUNC(void) _PyEval_SignalAsyncExc(PyInterpreterState *interp);
2727
#ifdef HAVE_FORK
2828
extern PyStatus _PyEval_ReInitThreads(PyThreadState *tstate);
2929
#endif
@@ -55,7 +55,7 @@ extern int _PyEval_ThreadsInitialized(PyInterpreterState *interp);
5555
extern int _PyEval_ThreadsInitialized(struct pyruntimestate *runtime);
5656
#endif
5757
extern PyStatus _PyEval_InitGIL(PyThreadState *tstate);
58-
extern void _PyEval_FiniGIL(PyThreadState *tstate);
58+
extern void _PyEval_FiniGIL(PyInterpreterState *interp);
5959

6060
extern void _PyEval_ReleaseLock(PyThreadState *tstate);
6161

Include/internal/pycore_context.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,6 @@ struct _pycontexttokenobject {
3737

3838

3939
int _PyContext_Init(void);
40-
void _PyContext_Fini(PyThreadState *tstate);
40+
void _PyContext_Fini(PyInterpreterState *interp);
4141

4242
#endif /* !Py_INTERNAL_CONTEXT_H */

Include/internal/pycore_gc.h

+7-7
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,13 @@ extern Py_ssize_t _PyGC_CollectNoFail(PyThreadState *tstate);
167167

168168

169169
// Functions to clear types free lists
170-
extern void _PyFrame_ClearFreeList(PyThreadState *tstate);
171-
extern void _PyTuple_ClearFreeList(PyThreadState *tstate);
172-
extern void _PyFloat_ClearFreeList(PyThreadState *tstate);
173-
extern void _PyList_ClearFreeList(PyThreadState *tstate);
174-
extern void _PyDict_ClearFreeList(PyThreadState *tstate);
175-
extern void _PyAsyncGen_ClearFreeLists(PyThreadState *tstate);
176-
extern void _PyContext_ClearFreeList(PyThreadState *tstate);
170+
extern void _PyFrame_ClearFreeList(PyInterpreterState *interp);
171+
extern void _PyTuple_ClearFreeList(PyInterpreterState *interp);
172+
extern void _PyFloat_ClearFreeList(PyInterpreterState *interp);
173+
extern void _PyList_ClearFreeList(PyInterpreterState *interp);
174+
extern void _PyDict_ClearFreeList(PyInterpreterState *interp);
175+
extern void _PyAsyncGen_ClearFreeLists(PyInterpreterState *interp);
176+
extern void _PyContext_ClearFreeList(PyInterpreterState *interp);
177177

178178
#ifdef __cplusplus
179179
}

Include/internal/pycore_pylifecycle.h

+25-25
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,21 @@ PyAPI_FUNC(int) _Py_IsLocaleCoercionTarget(const char *ctype_loc);
3131

3232
/* Various one-time initializers */
3333

34-
extern PyStatus _PyUnicode_Init(PyThreadState *tstate);
35-
extern PyStatus _PyBytes_Init(PyThreadState *tstate);
34+
extern PyStatus _PyUnicode_Init(PyInterpreterState *interp);
35+
extern PyStatus _PyBytes_Init(PyInterpreterState *interp);
3636
extern int _PyStructSequence_Init(void);
37-
extern int _PyLong_Init(PyThreadState *tstate);
38-
extern PyStatus _PyTuple_Init(PyThreadState *tstate);
37+
extern int _PyLong_Init(PyInterpreterState *interp);
38+
extern PyStatus _PyTuple_Init(PyInterpreterState *interp);
3939
extern PyStatus _PyFaulthandler_Init(int enable);
4040
extern int _PyTraceMalloc_Init(int enable);
41-
extern PyObject * _PyBuiltin_Init(PyThreadState *tstate);
41+
extern PyObject * _PyBuiltin_Init(PyInterpreterState *interp);
4242
extern PyStatus _PySys_Create(
4343
PyThreadState *tstate,
4444
PyObject **sysmod_p);
4545
extern PyStatus _PySys_ReadPreinitWarnOptions(PyWideStringList *options);
4646
extern PyStatus _PySys_ReadPreinitXOptions(PyConfig *config);
4747
extern int _PySys_UpdateConfig(PyThreadState *tstate);
48-
extern PyStatus _PyExc_Init(PyThreadState *tstate);
48+
extern PyStatus _PyExc_Init(PyInterpreterState *interp);
4949
extern PyStatus _PyErr_Init(void);
5050
extern PyStatus _PyBuiltins_AddExceptions(PyObject * bltinmod);
5151
extern int _PyFloat_Init(void);
@@ -54,33 +54,33 @@ extern PyStatus _Py_HashRandomization_Init(const PyConfig *);
5454
extern PyStatus _PyTypes_Init(void);
5555
extern PyStatus _PyTypes_InitSlotDefs(void);
5656
extern PyStatus _PyImportZip_Init(PyThreadState *tstate);
57-
extern PyStatus _PyGC_Init(PyThreadState *tstate);
58-
extern PyStatus _PyAtExit_Init(PyThreadState *tstate);
57+
extern PyStatus _PyGC_Init(PyInterpreterState *interp);
58+
extern PyStatus _PyAtExit_Init(PyInterpreterState *interp);
5959

6060

6161
/* Various internal finalizers */
6262

63-
extern void _PyFrame_Fini(PyThreadState *tstate);
64-
extern void _PyDict_Fini(PyThreadState *tstate);
65-
extern void _PyTuple_Fini(PyThreadState *tstate);
66-
extern void _PyList_Fini(PyThreadState *tstate);
67-
extern void _PyBytes_Fini(PyThreadState *tstate);
68-
extern void _PyFloat_Fini(PyThreadState *tstate);
69-
extern void _PySlice_Fini(PyThreadState *tstate);
70-
extern void _PyAsyncGen_Fini(PyThreadState *tstate);
63+
extern void _PyFrame_Fini(PyInterpreterState *interp);
64+
extern void _PyDict_Fini(PyInterpreterState *interp);
65+
extern void _PyTuple_Fini(PyInterpreterState *interp);
66+
extern void _PyList_Fini(PyInterpreterState *interp);
67+
extern void _PyBytes_Fini(PyInterpreterState *interp);
68+
extern void _PyFloat_Fini(PyInterpreterState *interp);
69+
extern void _PySlice_Fini(PyInterpreterState *interp);
70+
extern void _PyAsyncGen_Fini(PyInterpreterState *interp);
7171

7272
extern int _PySignal_Init(int install_signal_handlers);
7373
extern void _PySignal_Fini(void);
7474

75-
extern void _PyExc_Fini(PyThreadState *tstate);
75+
extern void _PyExc_Fini(PyInterpreterState *interp);
7676
extern void _PyImport_Fini(void);
7777
extern void _PyImport_Fini2(void);
78-
extern void _PyGC_Fini(PyThreadState *tstate);
79-
extern void _PyType_Fini(PyThreadState *tstate);
78+
extern void _PyGC_Fini(PyInterpreterState *interp);
79+
extern void _PyType_Fini(PyInterpreterState *interp);
8080
extern void _Py_HashRandomization_Fini(void);
81-
extern void _PyUnicode_Fini(PyThreadState *tstate);
82-
extern void _PyUnicode_ClearInterned(PyThreadState *tstate);
83-
extern void _PyLong_Fini(PyThreadState *tstate);
81+
extern void _PyUnicode_Fini(PyInterpreterState *interp);
82+
extern void _PyUnicode_ClearInterned(PyInterpreterState *interp);
83+
extern void _PyLong_Fini(PyInterpreterState *interp);
8484
extern void _PyFaulthandler_Fini(void);
8585
extern void _PyHash_Fini(void);
8686
extern void _PyTraceMalloc_Fini(void);
@@ -89,9 +89,9 @@ extern void _PyAST_Fini(PyInterpreterState *interp);
8989
extern void _PyAtExit_Fini(PyInterpreterState *interp);
9090

9191
extern PyStatus _PyGILState_Init(PyThreadState *tstate);
92-
extern void _PyGILState_Fini(PyThreadState *tstate);
92+
extern void _PyGILState_Fini(PyInterpreterState *interp);
9393

94-
PyAPI_FUNC(void) _PyGC_DumpShutdownStats(PyThreadState *tstate);
94+
PyAPI_FUNC(void) _PyGC_DumpShutdownStats(PyInterpreterState *interp);
9595

9696
PyAPI_FUNC(PyStatus) _Py_PreInitializeFromPyArgv(
9797
const PyPreConfig *src_config,
@@ -111,7 +111,7 @@ PyAPI_FUNC(void) _PyErr_Display(PyObject *file, PyObject *exception,
111111

112112
PyAPI_FUNC(void) _PyThreadState_DeleteCurrent(PyThreadState *tstate);
113113

114-
extern void _PyAtExit_Call(PyThreadState *tstate);
114+
extern void _PyAtExit_Call(PyInterpreterState *interp);
115115

116116
#ifdef __cplusplus
117117
}

Include/internal/pycore_warnings.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ struct _warnings_runtime_state {
1717
long filters_version;
1818
};
1919

20-
extern int _PyWarnings_InitState(PyThreadState *tstate);
20+
extern int _PyWarnings_InitState(PyInterpreterState *interp);
2121

2222
#ifdef __cplusplus
2323
}

Modules/atexitmodule.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ atexit_cleanup(struct atexit_state *state)
5252

5353

5454
PyStatus
55-
_PyAtExit_Init(PyThreadState *tstate)
55+
_PyAtExit_Init(PyInterpreterState *interp)
5656
{
57-
struct atexit_state *state = &tstate->interp->atexit;
57+
struct atexit_state *state = &interp->atexit;
5858
// _PyAtExit_Init() must only be called once
5959
assert(state->callbacks == NULL);
6060

@@ -109,9 +109,9 @@ atexit_callfuncs(struct atexit_state *state)
109109

110110

111111
void
112-
_PyAtExit_Call(PyThreadState *tstate)
112+
_PyAtExit_Call(PyInterpreterState *interp)
113113
{
114-
struct atexit_state *state = &tstate->interp->atexit;
114+
struct atexit_state *state = &interp->atexit;
115115
atexit_callfuncs(state);
116116
}
117117

Modules/gcmodule.c

+15-15
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,9 @@ _PyGC_InitState(GCState *gcstate)
161161

162162

163163
PyStatus
164-
_PyGC_Init(PyThreadState *tstate)
164+
_PyGC_Init(PyInterpreterState *interp)
165165
{
166-
GCState *gcstate = &tstate->interp->gc;
166+
GCState *gcstate = &interp->gc;
167167

168168
gcstate->garbage = PyList_New(0);
169169
if (gcstate->garbage == NULL) {
@@ -1036,15 +1036,15 @@ delete_garbage(PyThreadState *tstate, GCState *gcstate,
10361036
* Clearing the free lists may give back memory to the OS earlier.
10371037
*/
10381038
static void
1039-
clear_freelists(PyThreadState *tstate)
1039+
clear_freelists(PyInterpreterState *interp)
10401040
{
1041-
_PyFrame_ClearFreeList(tstate);
1042-
_PyTuple_ClearFreeList(tstate);
1043-
_PyFloat_ClearFreeList(tstate);
1044-
_PyList_ClearFreeList(tstate);
1045-
_PyDict_ClearFreeList(tstate);
1046-
_PyAsyncGen_ClearFreeLists(tstate);
1047-
_PyContext_ClearFreeList(tstate);
1041+
_PyFrame_ClearFreeList(interp);
1042+
_PyTuple_ClearFreeList(interp);
1043+
_PyFloat_ClearFreeList(interp);
1044+
_PyList_ClearFreeList(interp);
1045+
_PyDict_ClearFreeList(interp);
1046+
_PyAsyncGen_ClearFreeLists(interp);
1047+
_PyContext_ClearFreeList(interp);
10481048
}
10491049

10501050
// Show stats for objects in each generations
@@ -1323,7 +1323,7 @@ gc_collect_main(PyThreadState *tstate, int generation,
13231323
/* Clear free list only during the collection of the highest
13241324
* generation */
13251325
if (generation == NUM_GENERATIONS-1) {
1326-
clear_freelists(tstate);
1326+
clear_freelists(tstate->interp);
13271327
}
13281328

13291329
if (_PyErr_Occurred(tstate)) {
@@ -2092,9 +2092,9 @@ _PyGC_CollectNoFail(PyThreadState *tstate)
20922092
}
20932093

20942094
void
2095-
_PyGC_DumpShutdownStats(PyThreadState *tstate)
2095+
_PyGC_DumpShutdownStats(PyInterpreterState *interp)
20962096
{
2097-
GCState *gcstate = &tstate->interp->gc;
2097+
GCState *gcstate = &interp->gc;
20982098
if (!(gcstate->debug & DEBUG_SAVEALL)
20992099
&& gcstate->garbage != NULL && PyList_GET_SIZE(gcstate->garbage) > 0) {
21002100
const char *message;
@@ -2129,9 +2129,9 @@ _PyGC_DumpShutdownStats(PyThreadState *tstate)
21292129
}
21302130

21312131
void
2132-
_PyGC_Fini(PyThreadState *tstate)
2132+
_PyGC_Fini(PyInterpreterState *interp)
21332133
{
2134-
GCState *gcstate = &tstate->interp->gc;
2134+
GCState *gcstate = &interp->gc;
21352135
Py_CLEAR(gcstate->garbage);
21362136
Py_CLEAR(gcstate->callbacks);
21372137
}

Objects/bytesobject.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -3063,9 +3063,9 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
30633063

30643064

30653065
PyStatus
3066-
_PyBytes_Init(PyThreadState *tstate)
3066+
_PyBytes_Init(PyInterpreterState *interp)
30673067
{
3068-
struct _Py_bytes_state *state = &tstate->interp->bytes;
3068+
struct _Py_bytes_state *state = &interp->bytes;
30693069
if (bytes_create_empty_string_singleton(state) < 0) {
30703070
return _PyStatus_NO_MEMORY();
30713071
}
@@ -3074,9 +3074,9 @@ _PyBytes_Init(PyThreadState *tstate)
30743074

30753075

30763076
void
3077-
_PyBytes_Fini(PyThreadState *tstate)
3077+
_PyBytes_Fini(PyInterpreterState *interp)
30783078
{
3079-
struct _Py_bytes_state* state = &tstate->interp->bytes;
3079+
struct _Py_bytes_state* state = &interp->bytes;
30803080
for (int i = 0; i < UCHAR_MAX + 1; i++) {
30813081
Py_CLEAR(state->characters[i]);
30823082
}

Objects/dictobject.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -260,9 +260,9 @@ get_dict_state(void)
260260

261261

262262
void
263-
_PyDict_ClearFreeList(PyThreadState *tstate)
263+
_PyDict_ClearFreeList(PyInterpreterState *interp)
264264
{
265-
struct _Py_dict_state *state = &tstate->interp->dict_state;
265+
struct _Py_dict_state *state = &interp->dict_state;
266266
while (state->numfree) {
267267
PyDictObject *op = state->free_list[--state->numfree];
268268
assert(PyDict_CheckExact(op));
@@ -275,11 +275,11 @@ _PyDict_ClearFreeList(PyThreadState *tstate)
275275

276276

277277
void
278-
_PyDict_Fini(PyThreadState *tstate)
278+
_PyDict_Fini(PyInterpreterState *interp)
279279
{
280-
_PyDict_ClearFreeList(tstate);
280+
_PyDict_ClearFreeList(interp);
281281
#ifdef Py_DEBUG
282-
struct _Py_dict_state *state = get_dict_state();
282+
struct _Py_dict_state *state = &interp->dict_state;
283283
state->numfree = -1;
284284
state->keys_numfree = -1;
285285
#endif

Objects/exceptions.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -2529,9 +2529,9 @@ SimpleExtendsException(PyExc_Warning, ResourceWarning,
25292529
#endif /* MS_WINDOWS */
25302530

25312531
PyStatus
2532-
_PyExc_Init(PyThreadState *tstate)
2532+
_PyExc_Init(PyInterpreterState *interp)
25332533
{
2534-
struct _Py_exc_state *state = &tstate->interp->exc_state;
2534+
struct _Py_exc_state *state = &interp->exc_state;
25352535

25362536
#define PRE_INIT(TYPE) \
25372537
if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
@@ -2766,9 +2766,9 @@ _PyBuiltins_AddExceptions(PyObject *bltinmod)
27662766
}
27672767

27682768
void
2769-
_PyExc_Fini(PyThreadState *tstate)
2769+
_PyExc_Fini(PyInterpreterState *interp)
27702770
{
2771-
struct _Py_exc_state *state = &tstate->interp->exc_state;
2771+
struct _Py_exc_state *state = &interp->exc_state;
27722772
free_preallocated_memerrors(state);
27732773
Py_CLEAR(state->errnomap);
27742774
}

Objects/floatobject.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -2026,9 +2026,9 @@ _PyFloat_Init(void)
20262026
}
20272027

20282028
void
2029-
_PyFloat_ClearFreeList(PyThreadState *tstate)
2029+
_PyFloat_ClearFreeList(PyInterpreterState *interp)
20302030
{
2031-
struct _Py_float_state *state = &tstate->interp->float_state;
2031+
struct _Py_float_state *state = &interp->float_state;
20322032
PyFloatObject *f = state->free_list;
20332033
while (f != NULL) {
20342034
PyFloatObject *next = (PyFloatObject*) Py_TYPE(f);
@@ -2040,11 +2040,11 @@ _PyFloat_ClearFreeList(PyThreadState *tstate)
20402040
}
20412041

20422042
void
2043-
_PyFloat_Fini(PyThreadState *tstate)
2043+
_PyFloat_Fini(PyInterpreterState *interp)
20442044
{
2045-
_PyFloat_ClearFreeList(tstate);
2045+
_PyFloat_ClearFreeList(interp);
20462046
#ifdef Py_DEBUG
2047-
struct _Py_float_state *state = &tstate->interp->float_state;
2047+
struct _Py_float_state *state = &interp->float_state;
20482048
state->numfree = -1;
20492049
#endif
20502050
}

Objects/frameobject.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -1109,9 +1109,9 @@ PyFrame_LocalsToFast(PyFrameObject *f, int clear)
11091109

11101110
/* Clear out the free list */
11111111
void
1112-
_PyFrame_ClearFreeList(PyThreadState *tstate)
1112+
_PyFrame_ClearFreeList(PyInterpreterState *interp)
11131113
{
1114-
struct _Py_frame_state *state = &tstate->interp->frame;
1114+
struct _Py_frame_state *state = &interp->frame;
11151115
while (state->free_list != NULL) {
11161116
PyFrameObject *f = state->free_list;
11171117
state->free_list = state->free_list->f_back;
@@ -1122,11 +1122,11 @@ _PyFrame_ClearFreeList(PyThreadState *tstate)
11221122
}
11231123

11241124
void
1125-
_PyFrame_Fini(PyThreadState *tstate)
1125+
_PyFrame_Fini(PyInterpreterState *interp)
11261126
{
1127-
_PyFrame_ClearFreeList(tstate);
1127+
_PyFrame_ClearFreeList(interp);
11281128
#ifdef Py_DEBUG
1129-
struct _Py_frame_state *state = &tstate->interp->frame;
1129+
struct _Py_frame_state *state = &interp->frame;
11301130
state->numfree = -1;
11311131
#endif
11321132
}

0 commit comments

Comments
 (0)