<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sat, May 18, 2013 at 6:47 AM, Antoine Pitrou <span dir="ltr"><<a href="mailto:solipsis@pitrou.net" target="_blank">solipsis@pitrou.net</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">On Sat, 18 May 2013 06:37:54 -0700<br>
Eli Bendersky <<a href="mailto:eliben@gmail.com">eliben@gmail.com</a>> wrote:<br>
> Great PEP, I would really like to see this happen as it defines much saner<br>
> semantics for finalization than what we currently have. One small question<br>
> below:<br>
><br>
><br>
>  This PEP proposes to turn CI disposal into the following sequence (new<br>
> > steps are in bold):<br>
> ><br>
> > 1. Weakrefs to CI objects are cleared, and their callbacks called. At<br>
> >    this point, the objects are still safe to use.<br>
> ><br>
> > 2. **The finalizers of all CI objects are called.**<br>
> ><br>
> > 3. **The CI is traversed again to determine if it is still isolated.<br>
> >    If it is determined that at least one object in CI is now reachable<br>
> >    from outside the CI, this collection is aborted and the whole CI<br>
> >    is resurrected.  Otherwise, proceed.**<br>
> ><br>
><br>
> Not sure if my question is the same as Armin's here, but worth a try: by<br>
> saying "the CI is traversed again" do you mean the original objects from<br>
> the CI as discovered earlier, or is a new scan being done? What about a new<br>
> object entering the CI during step (2)? I.e. the original CI was A->B->A<br>
> but now one of the finalizers created some C such that B->C and C->A adding<br>
> it to the connected component?<br>
<br>
</div>It is the original CI which is traversed. If a new reference is<br>
introduced into the reference chain, the traversal in step 3 will<br>
decide to resurrect the CI. This is not necessarily a problem, since<br>
the next GC collection will try collecting again.<br>
<div class="im"><br>
> Reading your description in (3) strictly it says: in this case the<br>
> collection is aborted. This CI will be disposed next time collection is<br>
> run. Is this correct?<br>
<br>
</div>Yup.<br></blockquote></div><br></div><div class="gmail_extra">Thanks, this actually makes a lot of sense. It's strictly better than the current situation where objects with __del__ are never collected. In the proposed scheme, the weird ones will be delayed and some really weird ones may never be collected, but the vast majority of __del__ methods do no resurrection so usually it will just work.<br>

<br>This is a great proposal - killer new feature for 3.4 ;-)<br><br>Eli<br><br></div><div class="gmail_extra"><br></div></div>