summaryrefslogtreecommitdiffstats
path: root/Lib/_pyio.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/_pyio.py')
-rw-r--r--Lib/_pyio.py24
1 files changed, 24 insertions, 0 deletions
diff --git a/Lib/_pyio.py b/Lib/_pyio.py
index 1e105f2..6833883 100644
--- a/Lib/_pyio.py
+++ b/Lib/_pyio.py
@@ -1182,6 +1182,7 @@ class BufferedWriter(_BufferedIOMixin):
self.buffer_size = buffer_size
self._write_buf = bytearray()
self._write_lock = Lock()
+ _register_writer(self)
def writable(self):
return self.raw.writable()
@@ -2571,3 +2572,26 @@ class StringIO(TextIOWrapper):
def detach(self):
# This doesn't make sense on StringIO.
self._unsupported("detach")
+
+
+# ____________________________________________________________
+
+import atexit, weakref
+
+_all_writers = weakref.WeakSet()
+
+def _register_writer(w):
+ # keep weak-ref to buffered writer
+ _all_writers.add(w)
+
+def _flush_all_writers():
+ # Ensure all buffered writers are flushed before proceeding with
+ # normal shutdown. Otherwise, if the underlying file objects get
+ # finalized before the buffered writer wrapping it then any buffered
+ # data will be lost.
+ for w in _all_writers:
+ try:
+ w.flush()
+ except:
+ pass
+atexit.register(_flush_all_writers)