[Python-checkins] bpo-38858: Call _PyUnicode_Fini() in Py_EndInterpreter() (GH-17330)

Victor Stinner webhook-mailer at python.org
Fri Nov 22 06:27:57 EST 2019


https://github.com/python/cpython/commit/3d4833488a173c16446c3f94f58f05e2d13c5dee
commit: 3d4833488a173c16446c3f94f58f05e2d13c5dee
branch: master
author: Victor Stinner <vstinner at python.org>
committer: GitHub <noreply at github.com>
date: 2019-11-22T12:27:50+01:00
summary:

bpo-38858: Call _PyUnicode_Fini() in Py_EndInterpreter() (GH-17330)

Py_EndInterpreter() now clears the filesystem codec.

files:
M Include/internal/pycore_pylifecycle.h
M Objects/unicodeobject.c
M Python/pylifecycle.c

diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h
index c837bcdbc03cc..73aa5ef1f6cab 100644
--- a/Include/internal/pycore_pylifecycle.h
+++ b/Include/internal/pycore_pylifecycle.h
@@ -77,7 +77,7 @@ extern void _PyImport_Fini2(void);
 extern void _PyGC_Fini(PyThreadState *tstate);
 extern void _PyType_Fini(void);
 extern void _Py_HashRandomization_Fini(void);
-extern void _PyUnicode_Fini(void);
+extern void _PyUnicode_Fini(PyThreadState *tstate);
 extern void _PyLong_Fini(void);
 extern void _PyFaulthandler_Fini(void);
 extern void _PyHash_Fini(void);
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 5ae0af8ea336a..89e45d01e3789 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -15929,34 +15929,37 @@ _PyUnicode_EnableLegacyWindowsFSEncoding(void)
 
 
 void
-_PyUnicode_Fini(void)
+_PyUnicode_Fini(PyThreadState *tstate)
 {
+    if (_Py_IsMainInterpreter(tstate)) {
 #if defined(WITH_VALGRIND) || defined(__INSURE__)
-    /* Insure++ is a memory analysis tool that aids in discovering
-     * memory leaks and other memory problems.  On Python exit, the
-     * interned string dictionaries are flagged as being in use at exit
-     * (which it is).  Under normal circumstances, this is fine because
-     * the memory will be automatically reclaimed by the system.  Under
-     * memory debugging, it's a huge source of useless noise, so we
-     * trade off slower shutdown for less distraction in the memory
-     * reports.  -baw
-     */
-    unicode_release_interned();
+        /* Insure++ is a memory analysis tool that aids in discovering
+         * memory leaks and other memory problems.  On Python exit, the
+         * interned string dictionaries are flagged as being in use at exit
+         * (which it is).  Under normal circumstances, this is fine because
+         * the memory will be automatically reclaimed by the system.  Under
+         * memory debugging, it's a huge source of useless noise, so we
+         * trade off slower shutdown for less distraction in the memory
+         * reports.  -baw
+         */
+        unicode_release_interned();
 #endif /* __INSURE__ */
 
-    Py_CLEAR(unicode_empty);
+        Py_CLEAR(unicode_empty);
 
-    for (Py_ssize_t i = 0; i < 256; i++) {
-        Py_CLEAR(unicode_latin1[i]);
+        for (Py_ssize_t i = 0; i < 256; i++) {
+            Py_CLEAR(unicode_latin1[i]);
+        }
+        _PyUnicode_ClearStaticStrings();
+        (void)PyUnicode_ClearFreeList();
     }
-    _PyUnicode_ClearStaticStrings();
-    (void)PyUnicode_ClearFreeList();
 
     PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
     PyMem_RawFree(interp->fs_codec.encoding);
     interp->fs_codec.encoding = NULL;
     PyMem_RawFree(interp->fs_codec.errors);
     interp->fs_codec.errors = NULL;
+    interp->config.filesystem_errors = _Py_ERROR_UNKNOWN;
 }
 
 
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 8c508e33800ef..5f3c49a680439 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -1182,9 +1182,6 @@ finalize_interp_types(PyThreadState *tstate, int is_main_interp)
         _PySet_Fini();
         _PyBytes_Fini();
         _PyLong_Fini();
-    }
-
-    if (is_main_interp) {
         _PyFloat_Fini();
         _PyDict_Fini();
         _PySlice_Fini();
@@ -1197,9 +1194,12 @@ finalize_interp_types(PyThreadState *tstate, int is_main_interp)
         _PyArg_Fini();
         _PyAsyncGen_Fini();
         _PyContext_Fini();
+    }
+
+    /* Cleanup Unicode implementation */
+    _PyUnicode_Fini(tstate);
 
-        /* Cleanup Unicode implementation */
-        _PyUnicode_Fini();
+    if (is_main_interp) {
         _Py_ClearFileSystemEncoding();
     }
 }



More information about the Python-checkins mailing list