From 3d4833488a173c16446c3f94f58f05e2d13c5dee Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 22 Nov 2019 12:27:50 +0100 Subject: bpo-38858: Call _PyUnicode_Fini() in Py_EndInterpreter() (GH-17330) Py_EndInterpreter() now clears the filesystem codec. --- Include/internal/pycore_pylifecycle.h | 2 +- Objects/unicodeobject.c | 35 +++++++++++++++++++---------------- Python/pylifecycle.c | 10 +++++----- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index c837bcd..73aa5ef 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 5ae0af8..89e45d0 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 8c508e3..5f3c49a 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(); } } -- cgit v0.12