diff options
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) |
commit | fef7e94fa12f21c09997bd02809e677830966646 (patch) | |
tree | 2f355b7146c4eb0426b93c29ac96072824361c13 | |
parent | 9e3ef52a35c2d45edca40f9e4208aa8a08d6cdfd (diff) | |
download | cpython-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.h | 3 | ||||
-rw-r--r-- | Modules/gcmodule.c | 9 | ||||
-rw-r--r-- | Python/pylifecycle.c | 6 |
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, |