From: Antoine Pitrou Date: Thu, 15 Aug 2013 18:15:15 +0000 (+0200) Subject: Replace an overly optimistic assert() in _PyGC_CollectNoFail with a simple guard. X-Git-Tag: v3.4.0a2~219 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c69c9bc24bd8ea79775f1be025202d81ea800f0f;p=python Replace an overly optimistic assert() in _PyGC_CollectNoFail with a simple guard. --- diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 02e0cb831e..a84d752ffa 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; }