Message 308666 - Python tracker

This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Content
Welp, another day another attempt.  As mentioned in the PR 4847, atexit is not the answer.  If the raw/buffered file pair are part of a reference cycle and the GC cleans it before atexit runs, then the buffered data can get lost.

I attempted to implement my weakref idea (i.e. raw file keeps a weakref to the buffered file, calls flush before the raw file gets closed).  That doesn't work either because the GC clears the weakref before calling __del__.

The attached patch "buffer_register_flush.txt" does seem to work.  The downside is that it creates a reference cycle between the raw and buffered file objects.  Perhaps that is not a problem since unless you call close() on the raw file, you will be leaking resources anyhow.  In the patch, calling close() removes the reference cycle.

I still feel like this is worth fixing, as ugly as the implementation is.