This PEP proposes to turn CI disposal into the following sequence (new
steps are in bold):

1. Weakrefs to CI objects are cleared, and their callbacks called. At
� �this point, the objects are still safe to use.

2. **The finalizers of all CI objects are called.**

3. **The CI is traversed again to determine if it is still isolated.
� �If it is determined that at least one object in CI is now reachable
� �from outside the CI, this collection is aborted and the whole CI
� �is resurrected. �Otherwise, proceed.**

Not sure if my question is the same as Armin's here, but worth a try: by saying "the CI is traversed again" do you mean the original objects from the CI as discovered earlier, or is a new scan being done? What about a new object entering the CI during step (2)? I.e. the original CI was A->B->A but now one of the finalizers created some C such that B->C and C->A adding it to the connected component? 
">

(original) (raw)

Great PEP, I would really like to see this happen as it defines much saner semantics for finalization than what we currently have. One small question below:


This PEP proposes to turn CI disposal into the following sequence (new
steps are in bold):

1\. Weakrefs to CI objects are cleared, and their callbacks called. At
� �this point, the objects are still safe to use.

2\. \*\*The finalizers of all CI objects are called.\*\*

3\. \*\*The CI is traversed again to determine if it is still isolated.
� �If it is determined that at least one object in CI is now reachable
� �from outside the CI, this collection is aborted and the whole CI
� �is resurrected. �Otherwise, proceed.\*\*

Not sure if my question is the same as Armin's here, but worth a try: by saying "the CI is traversed again" do you mean the original objects from the CI as discovered earlier, or is a new scan being done? What about a new object entering the CI during step (2)? I.e. the original CI was A->B->A but now one of the finalizers created some C such that B->C and C->A adding it to the connected component?


Reading your description in (3) strictly it says: in this case the collection is aborted. This CI will be disposed next time collection is run. Is this correct?

Eli



4\. The CI becomes a CT as the GC systematically breaks all
� �known references inside it (using the \`\`tp\_clear\`\` function).

5\. Nothing. �All CT objects should have been disposed of in step 4
� �(as a side-effect of clearing references); this collection is
� �finished.

Eli