summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorŁukasz Langa <lukasz@langa.pl>2016-09-10 04:47:46 (GMT)
committerŁukasz Langa <lukasz@langa.pl>2016-09-10 04:47:46 (GMT)
commitfef7e94fa12f21c09997bd02809e677830966646 (patch)
tree2f355b7146c4eb0426b93c29ac96072824361c13
parent9e3ef52a35c2d45edca40f9e4208aa8a08d6cdfd (diff)
downloadcpython-fef7e94fa12f21c09997bd02809e677830966646.zip
cpython-fef7e94fa12f21c09997bd02809e677830966646.tar.gz
cpython-fef7e94fa12f21c09997bd02809e677830966646.tar.bz2
Don't run garbage collection on interpreter exit if it was explicitly disabled
by the user.
-rw-r--r--Include/objimpl.h3
-rw-r--r--Modules/gcmodule.c9
-rw-r--r--Python/pylifecycle.c6
3 files changed, 14 insertions, 4 deletions
diff --git a/Include/objimpl.h b/Include/objimpl.h
index 65b6d91..519ae51 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 2575d96..754348e 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -1597,6 +1597,15 @@ PyGC_Collect(void)
}
Py_ssize_t
+_PyGC_CollectIfEnabled(void)
+{
+ if (!enabled)
+ return 0;
+
+ return PyGC_Collect();
+}
+
+Py_ssize_t
_PyGC_CollectNoFail(void)
{
Py_ssize_t n;
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index f93afd2..5b5cc2b 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,