From: Ɓukasz Langa Date: Sat, 10 Sep 2016 04:47:46 +0000 (-0700) Subject: Don't run garbage collection on interpreter exit if it was explicitly disabled X-Git-Tag: v3.6.0b1~110 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fef7e94fa12f21c09997bd02809e677830966646;p=python Don't run garbage collection on interpreter exit if it was explicitly disabled by the user. --- diff --git a/Include/objimpl.h b/Include/objimpl.h index 65b6d91c36..519ae51605 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 2575d96d71..754348e20a 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 f93afd234d..5b5cc2b55e 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,