<br><br><div><span class="gmail_quote">On 8/30/07, <b class="gmail_sendername">"Martin v. Löwis"</b> <<a href="mailto:martin@v.loewis.de">martin@v.loewis.de</a>> wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
> I tried recreating the leak with more controllable types, but I haven't<br>> got very far. It seems to be caused by some weird interaction between<br>> io.FileIO, _fileio._FileIO and io.IOBase, specifically
io.IOBase.__del_<br>> _() calling self.close(), and io.FileIO.close() calling<br>> _fileio._FileIO.close() *and* io.RawIOBase.close(). The weird thing is<br>> that the contents of RawIOBase.close() doesn't matter. The mere act of
<br>> calling RawBaseIO.close (self) causes the leak. Remove the call, or<br>> change it into an attribute fetch, and the leak is gone. I'm stumped.<br><br>I think the problem is that the class remains referenced in
<br>io.RawIOBase._abc_cache:<br><br>py> io.RawIOBase._abc_cache<br>set()<br>py> class f(io.RawIOBase):pass<br>...<br>py> isinstance(f(), io.RawIOBase)<br>True<br>py> io.RawIOBase._abc_cache<br>{<class '__main__.f'>}
<br>py> del f<br>py> io.RawIOBase._abc_cache<br>{<class '__main__.f'>}<br><br>Each time test_destructor is called, another class will be added to<br>_abc_cache.</blockquote><div><br>Ahh, thanks, I missed that cache. After browsing the code a bit it seems to me the _abc_cache and _abc_negative_cache need to be turned into weak sets. (Since a class can appear in any number of caches, positive and negative, we can't just check refcounts on the items in the caches.) Do we have a weak set implementation anywhere yet? I think I have one lying around I wrote for someone else a while back, it could be added to the weakref module.
<br></div></div><br>-- <br>Thomas Wouters <<a href="mailto:thomas@python.org">thomas@python.org</a>><br><br>Hi! I'm a .signature virus! copy me into your .signature file to help me spread!