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

Py_EndInterpreter() now clears the filesystem codec.
This commit is contained in:
Victor Stinner 2019-11-22 12:27:50 +01:00 committed by GitHub
parent 310e2d2517
commit 3d4833488a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 22 deletions

View File

@ -77,7 +77,7 @@ extern void _PyImport_Fini2(void);
extern void _PyGC_Fini(PyThreadState *tstate); extern void _PyGC_Fini(PyThreadState *tstate);
extern void _PyType_Fini(void); extern void _PyType_Fini(void);
extern void _Py_HashRandomization_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 _PyLong_Fini(void);
extern void _PyFaulthandler_Fini(void); extern void _PyFaulthandler_Fini(void);
extern void _PyHash_Fini(void); extern void _PyHash_Fini(void);

View File

@ -15929,34 +15929,37 @@ _PyUnicode_EnableLegacyWindowsFSEncoding(void)
void void
_PyUnicode_Fini(void) _PyUnicode_Fini(PyThreadState *tstate)
{ {
if (_Py_IsMainInterpreter(tstate)) {
#if defined(WITH_VALGRIND) || defined(__INSURE__) #if defined(WITH_VALGRIND) || defined(__INSURE__)
/* Insure++ is a memory analysis tool that aids in discovering /* Insure++ is a memory analysis tool that aids in discovering
* memory leaks and other memory problems. On Python exit, the * memory leaks and other memory problems. On Python exit, the
* interned string dictionaries are flagged as being in use at exit * interned string dictionaries are flagged as being in use at exit
* (which it is). Under normal circumstances, this is fine because * (which it is). Under normal circumstances, this is fine because
* the memory will be automatically reclaimed by the system. Under * the memory will be automatically reclaimed by the system. Under
* memory debugging, it's a huge source of useless noise, so we * memory debugging, it's a huge source of useless noise, so we
* trade off slower shutdown for less distraction in the memory * trade off slower shutdown for less distraction in the memory
* reports. -baw * reports. -baw
*/ */
unicode_release_interned(); unicode_release_interned();
#endif /* __INSURE__ */ #endif /* __INSURE__ */
Py_CLEAR(unicode_empty); Py_CLEAR(unicode_empty);
for (Py_ssize_t i = 0; i < 256; i++) { for (Py_ssize_t i = 0; i < 256; i++) {
Py_CLEAR(unicode_latin1[i]); Py_CLEAR(unicode_latin1[i]);
}
_PyUnicode_ClearStaticStrings();
(void)PyUnicode_ClearFreeList();
} }
_PyUnicode_ClearStaticStrings();
(void)PyUnicode_ClearFreeList();
PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
PyMem_RawFree(interp->fs_codec.encoding); PyMem_RawFree(interp->fs_codec.encoding);
interp->fs_codec.encoding = NULL; interp->fs_codec.encoding = NULL;
PyMem_RawFree(interp->fs_codec.errors); PyMem_RawFree(interp->fs_codec.errors);
interp->fs_codec.errors = NULL; interp->fs_codec.errors = NULL;
interp->config.filesystem_errors = _Py_ERROR_UNKNOWN;
} }

View File

@ -1182,9 +1182,6 @@ finalize_interp_types(PyThreadState *tstate, int is_main_interp)
_PySet_Fini(); _PySet_Fini();
_PyBytes_Fini(); _PyBytes_Fini();
_PyLong_Fini(); _PyLong_Fini();
}
if (is_main_interp) {
_PyFloat_Fini(); _PyFloat_Fini();
_PyDict_Fini(); _PyDict_Fini();
_PySlice_Fini(); _PySlice_Fini();
@ -1197,9 +1194,12 @@ finalize_interp_types(PyThreadState *tstate, int is_main_interp)
_PyArg_Fini(); _PyArg_Fini();
_PyAsyncGen_Fini(); _PyAsyncGen_Fini();
_PyContext_Fini(); _PyContext_Fini();
}
/* Cleanup Unicode implementation */ /* Cleanup Unicode implementation */
_PyUnicode_Fini(); _PyUnicode_Fini(tstate);
if (is_main_interp) {
_Py_ClearFileSystemEncoding(); _Py_ClearFileSystemEncoding();
} }
} }