From fef7e94fa12f21c09997bd02809e677830966646 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= Date: Fri, 9 Sep 2016 21:47:46 -0700 Subject: [PATCH] Don't run garbage collection on interpreter exit if it was explicitly disabled by the user. --- Include/objimpl.h | 3 ++- Modules/gcmodule.c | 9 +++++++++ Python/pylifecycle.c | 6 +++--- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Include/objimpl.h b/Include/objimpl.h index 65b6d91c36c..519ae516053 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -224,11 +224,12 @@ PyAPI_FUNC(void) PyObject_SetArenaAllocator(PyObjectArenaAllocator *allocator); * ========================== */ -/* C equivalent of gc.collect(). */ +/* C equivalent of gc.collect() which ignores the state of gc.enabled. */ PyAPI_FUNC(Py_ssize_t) PyGC_Collect(void); #ifndef Py_LIMITED_API PyAPI_FUNC(Py_ssize_t) _PyGC_CollectNoFail(void); +PyAPI_FUNC(Py_ssize_t) _PyGC_CollectIfEnabled(void); #endif /* Test if a type has a GC head */ diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 2575d96d71c..754348e20a9 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -1596,6 +1596,15 @@ PyGC_Collect(void) return n; } +Py_ssize_t +_PyGC_CollectIfEnabled(void) +{ + if (!enabled) + return 0; + + return PyGC_Collect(); +} + Py_ssize_t _PyGC_CollectNoFail(void) { diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index f93afd234da..5b5cc2b55e8 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -600,12 +600,12 @@ Py_FinalizeEx(void) * XXX but I'm unclear on exactly how that one happens. In any case, * XXX I haven't seen a real-life report of either of these. */ - PyGC_Collect(); + _PyGC_CollectIfEnabled(); #ifdef COUNT_ALLOCS /* With COUNT_ALLOCS, it helps to run GC multiple times: each collection might release some types from the type list, so they become garbage. */ - while (PyGC_Collect() > 0) + while (_PyGC_CollectIfEnabled() > 0) /* nothing */; #endif /* Destroy all modules */ @@ -632,7 +632,7 @@ Py_FinalizeEx(void) * XXX Python code getting called. */ #if 0 - PyGC_Collect(); + _PyGC_CollectIfEnabled(); #endif /* Disable tracemalloc after all Python objects have been destroyed,