bpo-32030: Add pymain_get_global_config() (#4735)

* Py_Main() now starts by reading Py_xxx configuration variables to
  only work on its own private structure, and then later writes back
  the configuration into these variables.
* Replace Py_GETENV() with pymain_get_env_var() which ignores empty
  variables.
* Add _PyCoreConfig.dump_refs
* Add _PyCoreConfig.malloc_stats
* _PyObject_DebugMallocStats() is now responsible to check if debug
  hooks are installed. The function returns 1 if stats were written,
  or 0 if the hooks are disabled. Mark _PyMem_PymallocEnabled() as
  static.
This commit is contained in:
Victor Stinner 2017-12-06 17:26:10 +01:00 committed by GitHub
parent 672b6baa71
commit 6bf992a1ac
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 141 additions and 76 deletions

View file

@ -1103,6 +1103,10 @@ Py_FinalizeEx(void)
tstate = PyThreadState_GET();
interp = tstate->interp;
/* Copy the core config to be able to use it even
after PyInterpreterState_Delete() */
_PyCoreConfig core_config = interp->core_config;
/* Remaining threads (e.g. daemon threads) will automatically exit
after taking the GIL (in PyEval_RestoreThread()). */
_PyRuntime.finalizing = tstate;
@ -1186,7 +1190,7 @@ Py_FinalizeEx(void)
_PyHash_Fini();
#ifdef Py_REF_DEBUG
if (interp->core_config.show_ref_count) {
if (core_config.show_ref_count) {
_PyDebug_PrintTotalRefs();
}
#endif
@ -1197,8 +1201,9 @@ Py_FinalizeEx(void)
* Alas, a lot of stuff may still be alive now that will be cleaned
* up later.
*/
if (Py_GETENV("PYTHONDUMPREFS"))
if (core_config.dump_refs) {
_Py_PrintReferences(stderr);
}
#endif /* Py_TRACE_REFS */
/* Clear interpreter state and all thread states. */
@ -1260,14 +1265,13 @@ Py_FinalizeEx(void)
* An address can be used to find the repr of the object, printed
* above by _Py_PrintReferences.
*/
if (Py_GETENV("PYTHONDUMPREFS"))
if (core_config.dump_refs) {
_Py_PrintReferenceAddresses(stderr);
}
#endif /* Py_TRACE_REFS */
#ifdef WITH_PYMALLOC
if (_PyMem_PymallocEnabled()) {
char *opt = Py_GETENV("PYTHONMALLOCSTATS");
if (opt != NULL && *opt != '\0')
_PyObject_DebugMallocStats(stderr);
if (core_config.malloc_stats) {
_PyObject_DebugMallocStats(stderr);
}
#endif