summaryrefslogtreecommitdiffstats
path: root/Modules/gcmodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/gcmodule.c')
-rw-r--r--Modules/gcmodule.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index 02e0cb8..a84d752 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -1612,12 +1612,19 @@ _PyGC_CollectNoFail(void)
{
Py_ssize_t n;
- /* This function should only be called on interpreter shutdown, and
- therefore not recursively. */
- assert(!collecting);
- collecting = 1;
- n = collect(NUM_GENERATIONS - 1, NULL, NULL, 1);
- collecting = 0;
+ /* Ideally, this function is only called on interpreter shutdown,
+ and therefore not recursively. Unfortunately, when there are daemon
+ threads, a daemon thread can start a cyclic garbage collection
+ during interpreter shutdown (and then never finish it).
+ See http://bugs.python.org/issue8713#msg195178 for an example.
+ */
+ if (collecting)
+ n = 0;
+ else {
+ collecting = 1;
+ n = collect(NUM_GENERATIONS - 1, NULL, NULL, 1);
+ collecting = 0;
+ }
return n;
}