From c69c9bc24bd8ea79775f1be025202d81ea800f0f Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Thu, 15 Aug 2013 20:15:15 +0200 Subject: Replace an overly optimistic assert() in _PyGC_CollectNoFail with a simple guard. --- Modules/gcmodule.c | 19 +++++++++++++------ 1 file 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; } -- cgit v0.12