;Victor Stinner <vstin...@python.org>]
> ...
> For a more concrete example, read the "_thread lock traverse" section
> of my article on these problems:
> https://vstinner.github.io/subinterpreter-leaks.html
>
> There were two reference cycles, and both were "connected" with a lock
> object in the middle (look at my drawing). The lock object was *not*
> directly part of any ref cycle. But because it had no traverse
> function, the GC failed to break both cycles in a single collection. A
> second manual GC collection was needed to break the second cycles, to
> *work around* the issue.

Thanks! Let me correct/refine my characterization. For cyclic GC to
work as intended, every object from which a cycle may be reached must
participate in cyclic GC, and its tp_traverse must visit every
contained object from which a cycle may be reached. Necessary and
sufficient, there. Contrary to previous stabs, it's actually
irrelevant whether the object may itself be directly in a cycle.  As
in your example, it can do damage to the intent if an object is merely
a (or just on an) acyclic bridge between cycles (even though not
_itself_ in a cycle).

So, if we're saying that type objects in general may be in cycles,
then it's necessary that absolutely every object participate in GC,
and its tp_traverse must visit absolutely every object it points to
(every object points to a type object, as does every contained object
likewise: there are potential cycles everywhere).

So, on what principled basis do we exempt, say, ints from
participating in cyclic GC too? Do we have to "just know" that a cycle
can't be reached from an int's type object? If so, is that even true?
Or just convenient to pretend to believe to avoid adding 16 more bytes
to each int object and grossly slowing gc scans in the presence of
many ints? ;-) If it is true, how do we know for which type objects it
is and isn't true?
_______________________________________________
python-committers mailing list -- python-committers@python.org
To unsubscribe send an email to python-committers-le...@python.org
https://mail.python.org/mailman3/lists/python-committers.python.org/
Message archived at 
https://mail.python.org/archives/list/python-committers@python.org/message/MGXEPWDK6N3AK7RDGSZIOXCH77PTZGLL/
Code of Conduct: https://www.python.org/psf/codeofconduct/

Reply via email to