diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 43c499a0452..3498f0d484e 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -286,7 +286,9 @@ void _PyType_Fini(PyThreadState *tstate) { _PyType_ClearCache(&tstate->interp->type_cache); - clear_slotdefs(); + if (_Py_IsMainInterpreter(tstate)) { + clear_slotdefs(); + } } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index a03ca9a10d1..ad32a062d48 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -2359,10 +2359,9 @@ _PyUnicode_FromId(_Py_Identifier *id) static void -unicode_clear_identifiers(PyThreadState *tstate) +unicode_clear_identifiers(struct _Py_unicode_state *state) { - PyInterpreterState *interp = _PyInterpreterState_GET(); - struct _Py_unicode_ids *ids = &interp->unicode.ids; + struct _Py_unicode_ids *ids = &state->ids; for (Py_ssize_t i=0; i < ids->size; i++) { Py_XDECREF(ids->array[i]); } @@ -16243,7 +16242,7 @@ _PyUnicode_Fini(PyThreadState *tstate) _PyUnicode_FiniEncodings(&state->fs_codec); - unicode_clear_identifiers(tstate); + unicode_clear_identifiers(state); for (Py_ssize_t i = 0; i < 256; i++) { Py_CLEAR(state->latin1[i]); diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index ccbacb48194..9828dffad5c 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1573,6 +1573,7 @@ finalize_interp_types(PyThreadState *tstate) _PyFrame_Fini(tstate); _PyAsyncGen_Fini(tstate); _PyContext_Fini(tstate); + _PyType_Fini(tstate); // Call _PyUnicode_ClearInterned() before _PyDict_Fini() since it uses // a dict internally. _PyUnicode_ClearInterned(tstate); @@ -1751,9 +1752,6 @@ Py_FinalizeEx(void) /* Destroy the database used by _PyImport_{Fixup,Find}Extension */ _PyImport_Fini(); - /* Cleanup typeobject.c's internal caches. */ - _PyType_Fini(tstate); - /* unload faulthandler module */ _PyFaulthandler_Fini();