]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-42745: finalize_interp_types() calls _PyType_Fini() (GH-23953)
authorVictor Stinner <vstinner@python.org>
Sat, 26 Dec 2020 19:26:08 +0000 (20:26 +0100)
committerGitHub <noreply@github.com>
Sat, 26 Dec 2020 19:26:08 +0000 (20:26 +0100)
Call _PyType_Fini() in subinterpreters.

Fix reference leaks in subinterpreters.

Objects/typeobject.c
Objects/unicodeobject.c
Python/pylifecycle.c

index 43c499a04524f5b2d3c6f00929f8cf710dc78028..3498f0d484e01e2b31b234d8dc0f12ba428308a1 100644 (file)
@@ -286,7 +286,9 @@ void
 _PyType_Fini(PyThreadState *tstate)
 {
     _PyType_ClearCache(&tstate->interp->type_cache);
-    clear_slotdefs();
+    if (_Py_IsMainInterpreter(tstate)) {
+        clear_slotdefs();
+    }
 }
 
 
index a03ca9a10d152ff17f718f4687e99b9e79edef19..ad32a062d4854481477e93aa9753d85b6bb68ee9 100644 (file)
@@ -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]);
index ccbacb481947c24cd90c7841378e6bf59a5d80cb..9828dffad5c63009f34173c412e7bf65614d3da2 100644 (file)
@@ -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();