Skip to content

Commit

Permalink
bpo-43268: Pass interp rather than tstate to internal functions (GH-2…
Browse files Browse the repository at this point in the history
…4580)

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.
  • Loading branch information
vstinner committed Feb 19, 2021
1 parent a486054 commit bcb094b
Show file tree
Hide file tree
Showing 29 changed files with 240 additions and 245 deletions.
4 changes: 2 additions & 2 deletions Include/internal/pycore_ceval.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ PyAPI_FUNC(int) _PyEval_AddPendingCall(
PyInterpreterState *interp,
int (*func)(void *),
void *arg);
PyAPI_FUNC(void) _PyEval_SignalAsyncExc(PyThreadState *tstate);
PyAPI_FUNC(void) _PyEval_SignalAsyncExc(PyInterpreterState *interp);
#ifdef HAVE_FORK
extern PyStatus _PyEval_ReInitThreads(PyThreadState *tstate);
#endif
Expand Down Expand Up @@ -55,7 +55,7 @@ extern int _PyEval_ThreadsInitialized(PyInterpreterState *interp);
extern int _PyEval_ThreadsInitialized(struct pyruntimestate *runtime);
#endif
extern PyStatus _PyEval_InitGIL(PyThreadState *tstate);
extern void _PyEval_FiniGIL(PyThreadState *tstate);
extern void _PyEval_FiniGIL(PyInterpreterState *interp);

extern void _PyEval_ReleaseLock(PyThreadState *tstate);

Expand Down
2 changes: 1 addition & 1 deletion Include/internal/pycore_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,6 @@ struct _pycontexttokenobject {


int _PyContext_Init(void);
void _PyContext_Fini(PyThreadState *tstate);
void _PyContext_Fini(PyInterpreterState *interp);

#endif /* !Py_INTERNAL_CONTEXT_H */
14 changes: 7 additions & 7 deletions Include/internal/pycore_gc.h
Original file line number Diff line number Diff line change
Expand Up @@ -167,13 +167,13 @@ extern Py_ssize_t _PyGC_CollectNoFail(PyThreadState *tstate);


// Functions to clear types free lists
extern void _PyFrame_ClearFreeList(PyThreadState *tstate);
extern void _PyTuple_ClearFreeList(PyThreadState *tstate);
extern void _PyFloat_ClearFreeList(PyThreadState *tstate);
extern void _PyList_ClearFreeList(PyThreadState *tstate);
extern void _PyDict_ClearFreeList(PyThreadState *tstate);
extern void _PyAsyncGen_ClearFreeLists(PyThreadState *tstate);
extern void _PyContext_ClearFreeList(PyThreadState *tstate);
extern void _PyFrame_ClearFreeList(PyInterpreterState *interp);
extern void _PyTuple_ClearFreeList(PyInterpreterState *interp);
extern void _PyFloat_ClearFreeList(PyInterpreterState *interp);
extern void _PyList_ClearFreeList(PyInterpreterState *interp);
extern void _PyDict_ClearFreeList(PyInterpreterState *interp);
extern void _PyAsyncGen_ClearFreeLists(PyInterpreterState *interp);
extern void _PyContext_ClearFreeList(PyInterpreterState *interp);

#ifdef __cplusplus
}
Expand Down
50 changes: 25 additions & 25 deletions Include/internal/pycore_pylifecycle.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,21 +31,21 @@ PyAPI_FUNC(int) _Py_IsLocaleCoercionTarget(const char *ctype_loc);

/* Various one-time initializers */

extern PyStatus _PyUnicode_Init(PyThreadState *tstate);
extern PyStatus _PyBytes_Init(PyThreadState *tstate);
extern PyStatus _PyUnicode_Init(PyInterpreterState *interp);
extern PyStatus _PyBytes_Init(PyInterpreterState *interp);
extern int _PyStructSequence_Init(void);
extern int _PyLong_Init(PyThreadState *tstate);
extern PyStatus _PyTuple_Init(PyThreadState *tstate);
extern int _PyLong_Init(PyInterpreterState *interp);
extern PyStatus _PyTuple_Init(PyInterpreterState *interp);
extern PyStatus _PyFaulthandler_Init(int enable);
extern int _PyTraceMalloc_Init(int enable);
extern PyObject * _PyBuiltin_Init(PyThreadState *tstate);
extern PyObject * _PyBuiltin_Init(PyInterpreterState *interp);
extern PyStatus _PySys_Create(
PyThreadState *tstate,
PyObject **sysmod_p);
extern PyStatus _PySys_ReadPreinitWarnOptions(PyWideStringList *options);
extern PyStatus _PySys_ReadPreinitXOptions(PyConfig *config);
extern int _PySys_UpdateConfig(PyThreadState *tstate);
extern PyStatus _PyExc_Init(PyThreadState *tstate);
extern PyStatus _PyExc_Init(PyInterpreterState *interp);
extern PyStatus _PyErr_Init(void);
extern PyStatus _PyBuiltins_AddExceptions(PyObject * bltinmod);
extern int _PyFloat_Init(void);
Expand All @@ -54,33 +54,33 @@ extern PyStatus _Py_HashRandomization_Init(const PyConfig *);
extern PyStatus _PyTypes_Init(void);
extern PyStatus _PyTypes_InitSlotDefs(void);
extern PyStatus _PyImportZip_Init(PyThreadState *tstate);
extern PyStatus _PyGC_Init(PyThreadState *tstate);
extern PyStatus _PyAtExit_Init(PyThreadState *tstate);
extern PyStatus _PyGC_Init(PyInterpreterState *interp);
extern PyStatus _PyAtExit_Init(PyInterpreterState *interp);


/* Various internal finalizers */

extern void _PyFrame_Fini(PyThreadState *tstate);
extern void _PyDict_Fini(PyThreadState *tstate);
extern void _PyTuple_Fini(PyThreadState *tstate);
extern void _PyList_Fini(PyThreadState *tstate);
extern void _PyBytes_Fini(PyThreadState *tstate);
extern void _PyFloat_Fini(PyThreadState *tstate);
extern void _PySlice_Fini(PyThreadState *tstate);
extern void _PyAsyncGen_Fini(PyThreadState *tstate);
extern void _PyFrame_Fini(PyInterpreterState *interp);
extern void _PyDict_Fini(PyInterpreterState *interp);
extern void _PyTuple_Fini(PyInterpreterState *interp);
extern void _PyList_Fini(PyInterpreterState *interp);
extern void _PyBytes_Fini(PyInterpreterState *interp);
extern void _PyFloat_Fini(PyInterpreterState *interp);
extern void _PySlice_Fini(PyInterpreterState *interp);
extern void _PyAsyncGen_Fini(PyInterpreterState *interp);

extern int _PySignal_Init(int install_signal_handlers);
extern void _PySignal_Fini(void);

extern void _PyExc_Fini(PyThreadState *tstate);
extern void _PyExc_Fini(PyInterpreterState *interp);
extern void _PyImport_Fini(void);
extern void _PyImport_Fini2(void);
extern void _PyGC_Fini(PyThreadState *tstate);
extern void _PyType_Fini(PyThreadState *tstate);
extern void _PyGC_Fini(PyInterpreterState *interp);
extern void _PyType_Fini(PyInterpreterState *interp);
extern void _Py_HashRandomization_Fini(void);
extern void _PyUnicode_Fini(PyThreadState *tstate);
extern void _PyUnicode_ClearInterned(PyThreadState *tstate);
extern void _PyLong_Fini(PyThreadState *tstate);
extern void _PyUnicode_Fini(PyInterpreterState *interp);
extern void _PyUnicode_ClearInterned(PyInterpreterState *interp);
extern void _PyLong_Fini(PyInterpreterState *interp);
extern void _PyFaulthandler_Fini(void);
extern void _PyHash_Fini(void);
extern void _PyTraceMalloc_Fini(void);
Expand All @@ -89,9 +89,9 @@ extern void _PyAST_Fini(PyInterpreterState *interp);
extern void _PyAtExit_Fini(PyInterpreterState *interp);

extern PyStatus _PyGILState_Init(PyThreadState *tstate);
extern void _PyGILState_Fini(PyThreadState *tstate);
extern void _PyGILState_Fini(PyInterpreterState *interp);

PyAPI_FUNC(void) _PyGC_DumpShutdownStats(PyThreadState *tstate);
PyAPI_FUNC(void) _PyGC_DumpShutdownStats(PyInterpreterState *interp);

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

PyAPI_FUNC(void) _PyThreadState_DeleteCurrent(PyThreadState *tstate);

extern void _PyAtExit_Call(PyThreadState *tstate);
extern void _PyAtExit_Call(PyInterpreterState *interp);

#ifdef __cplusplus
}
Expand Down
2 changes: 1 addition & 1 deletion Include/internal/pycore_warnings.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ struct _warnings_runtime_state {
long filters_version;
};

extern int _PyWarnings_InitState(PyThreadState *tstate);
extern int _PyWarnings_InitState(PyInterpreterState *interp);

#ifdef __cplusplus
}
Expand Down
8 changes: 4 additions & 4 deletions Modules/atexitmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,9 @@ atexit_cleanup(struct atexit_state *state)


PyStatus
_PyAtExit_Init(PyThreadState *tstate)
_PyAtExit_Init(PyInterpreterState *interp)
{
struct atexit_state *state = &tstate->interp->atexit;
struct atexit_state *state = &interp->atexit;
// _PyAtExit_Init() must only be called once
assert(state->callbacks == NULL);

Expand Down Expand Up @@ -109,9 +109,9 @@ atexit_callfuncs(struct atexit_state *state)


void
_PyAtExit_Call(PyThreadState *tstate)
_PyAtExit_Call(PyInterpreterState *interp)
{
struct atexit_state *state = &tstate->interp->atexit;
struct atexit_state *state = &interp->atexit;
atexit_callfuncs(state);
}

Expand Down
30 changes: 15 additions & 15 deletions Modules/gcmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,9 +161,9 @@ _PyGC_InitState(GCState *gcstate)


PyStatus
_PyGC_Init(PyThreadState *tstate)
_PyGC_Init(PyInterpreterState *interp)
{
GCState *gcstate = &tstate->interp->gc;
GCState *gcstate = &interp->gc;

gcstate->garbage = PyList_New(0);
if (gcstate->garbage == NULL) {
Expand Down Expand Up @@ -1036,15 +1036,15 @@ delete_garbage(PyThreadState *tstate, GCState *gcstate,
* Clearing the free lists may give back memory to the OS earlier.
*/
static void
clear_freelists(PyThreadState *tstate)
clear_freelists(PyInterpreterState *interp)
{
_PyFrame_ClearFreeList(tstate);
_PyTuple_ClearFreeList(tstate);
_PyFloat_ClearFreeList(tstate);
_PyList_ClearFreeList(tstate);
_PyDict_ClearFreeList(tstate);
_PyAsyncGen_ClearFreeLists(tstate);
_PyContext_ClearFreeList(tstate);
_PyFrame_ClearFreeList(interp);
_PyTuple_ClearFreeList(interp);
_PyFloat_ClearFreeList(interp);
_PyList_ClearFreeList(interp);
_PyDict_ClearFreeList(interp);
_PyAsyncGen_ClearFreeLists(interp);
_PyContext_ClearFreeList(interp);
}

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

if (_PyErr_Occurred(tstate)) {
Expand Down Expand Up @@ -2092,9 +2092,9 @@ _PyGC_CollectNoFail(PyThreadState *tstate)
}

void
_PyGC_DumpShutdownStats(PyThreadState *tstate)
_PyGC_DumpShutdownStats(PyInterpreterState *interp)
{
GCState *gcstate = &tstate->interp->gc;
GCState *gcstate = &interp->gc;
if (!(gcstate->debug & DEBUG_SAVEALL)
&& gcstate->garbage != NULL && PyList_GET_SIZE(gcstate->garbage) > 0) {
const char *message;
Expand Down Expand Up @@ -2129,9 +2129,9 @@ _PyGC_DumpShutdownStats(PyThreadState *tstate)
}

void
_PyGC_Fini(PyThreadState *tstate)
_PyGC_Fini(PyInterpreterState *interp)
{
GCState *gcstate = &tstate->interp->gc;
GCState *gcstate = &interp->gc;
Py_CLEAR(gcstate->garbage);
Py_CLEAR(gcstate->callbacks);
}
Expand Down
8 changes: 4 additions & 4 deletions Objects/bytesobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -3063,9 +3063,9 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)


PyStatus
_PyBytes_Init(PyThreadState *tstate)
_PyBytes_Init(PyInterpreterState *interp)
{
struct _Py_bytes_state *state = &tstate->interp->bytes;
struct _Py_bytes_state *state = &interp->bytes;
if (bytes_create_empty_string_singleton(state) < 0) {
return _PyStatus_NO_MEMORY();
}
Expand All @@ -3074,9 +3074,9 @@ _PyBytes_Init(PyThreadState *tstate)


void
_PyBytes_Fini(PyThreadState *tstate)
_PyBytes_Fini(PyInterpreterState *interp)
{
struct _Py_bytes_state* state = &tstate->interp->bytes;
struct _Py_bytes_state* state = &interp->bytes;
for (int i = 0; i < UCHAR_MAX + 1; i++) {
Py_CLEAR(state->characters[i]);
}
Expand Down
10 changes: 5 additions & 5 deletions Objects/dictobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -260,9 +260,9 @@ get_dict_state(void)


void
_PyDict_ClearFreeList(PyThreadState *tstate)
_PyDict_ClearFreeList(PyInterpreterState *interp)
{
struct _Py_dict_state *state = &tstate->interp->dict_state;
struct _Py_dict_state *state = &interp->dict_state;
while (state->numfree) {
PyDictObject *op = state->free_list[--state->numfree];
assert(PyDict_CheckExact(op));
Expand All @@ -275,11 +275,11 @@ _PyDict_ClearFreeList(PyThreadState *tstate)


void
_PyDict_Fini(PyThreadState *tstate)
_PyDict_Fini(PyInterpreterState *interp)
{
_PyDict_ClearFreeList(tstate);
_PyDict_ClearFreeList(interp);
#ifdef Py_DEBUG
struct _Py_dict_state *state = get_dict_state();
struct _Py_dict_state *state = &interp->dict_state;
state->numfree = -1;
state->keys_numfree = -1;
#endif
Expand Down
8 changes: 4 additions & 4 deletions Objects/exceptions.c
Original file line number Diff line number Diff line change
Expand Up @@ -2529,9 +2529,9 @@ SimpleExtendsException(PyExc_Warning, ResourceWarning,
#endif /* MS_WINDOWS */

PyStatus
_PyExc_Init(PyThreadState *tstate)
_PyExc_Init(PyInterpreterState *interp)
{
struct _Py_exc_state *state = &tstate->interp->exc_state;
struct _Py_exc_state *state = &interp->exc_state;

#define PRE_INIT(TYPE) \
if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
Expand Down Expand Up @@ -2766,9 +2766,9 @@ _PyBuiltins_AddExceptions(PyObject *bltinmod)
}

void
_PyExc_Fini(PyThreadState *tstate)
_PyExc_Fini(PyInterpreterState *interp)
{
struct _Py_exc_state *state = &tstate->interp->exc_state;
struct _Py_exc_state *state = &interp->exc_state;
free_preallocated_memerrors(state);
Py_CLEAR(state->errnomap);
}
Expand Down
10 changes: 5 additions & 5 deletions Objects/floatobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -2026,9 +2026,9 @@ _PyFloat_Init(void)
}

void
_PyFloat_ClearFreeList(PyThreadState *tstate)
_PyFloat_ClearFreeList(PyInterpreterState *interp)
{
struct _Py_float_state *state = &tstate->interp->float_state;
struct _Py_float_state *state = &interp->float_state;
PyFloatObject *f = state->free_list;
while (f != NULL) {
PyFloatObject *next = (PyFloatObject*) Py_TYPE(f);
Expand All @@ -2040,11 +2040,11 @@ _PyFloat_ClearFreeList(PyThreadState *tstate)
}

void
_PyFloat_Fini(PyThreadState *tstate)
_PyFloat_Fini(PyInterpreterState *interp)
{
_PyFloat_ClearFreeList(tstate);
_PyFloat_ClearFreeList(interp);
#ifdef Py_DEBUG
struct _Py_float_state *state = &tstate->interp->float_state;
struct _Py_float_state *state = &interp->float_state;
state->numfree = -1;
#endif
}
Expand Down
10 changes: 5 additions & 5 deletions Objects/frameobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -1109,9 +1109,9 @@ PyFrame_LocalsToFast(PyFrameObject *f, int clear)

/* Clear out the free list */
void
_PyFrame_ClearFreeList(PyThreadState *tstate)
_PyFrame_ClearFreeList(PyInterpreterState *interp)
{
struct _Py_frame_state *state = &tstate->interp->frame;
struct _Py_frame_state *state = &interp->frame;
while (state->free_list != NULL) {
PyFrameObject *f = state->free_list;
state->free_list = state->free_list->f_back;
Expand All @@ -1122,11 +1122,11 @@ _PyFrame_ClearFreeList(PyThreadState *tstate)
}

void
_PyFrame_Fini(PyThreadState *tstate)
_PyFrame_Fini(PyInterpreterState *interp)
{
_PyFrame_ClearFreeList(tstate);
_PyFrame_ClearFreeList(interp);
#ifdef Py_DEBUG
struct _Py_frame_state *state = &tstate->interp->frame;
struct _Py_frame_state *state = &interp->frame;
state->numfree = -1;
#endif
}
Expand Down
Loading

0 comments on commit bcb094b

Please sign in to comment.