From db564238db440d4a2d8eb9d60ffb94ef291f6d30 Mon Sep 17 00:00:00 2001 From: Neil Schemenauer Date: Mon, 4 Sep 2017 22:13:17 -0700 Subject: [PATCH] Revert "bpo-17852: Maintain a list of BufferedWriter objects. Flush them on exit. (#1908)" (#3337) This reverts commit e38d12ed34870c140016bef1e0ff10c8c3d3f213. --- Lib/_pyio.py | 24 ---------- .../2017-09-04-12-46-25.bpo-17852.OxAtCg.rst | 2 - Modules/_io/_iomodule.c | 2 - Modules/_io/_iomodule.h | 2 - Modules/_io/bufferedio.c | 46 +------------------ 5 files changed, 1 insertion(+), 75 deletions(-) delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2017-09-04-12-46-25.bpo-17852.OxAtCg.rst diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 3aa2b24c040..4653847bcb1 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -1185,7 +1185,6 @@ 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() @@ -2575,26 +2574,3 @@ 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) diff --git a/Misc/NEWS.d/next/Core and Builtins/2017-09-04-12-46-25.bpo-17852.OxAtCg.rst b/Misc/NEWS.d/next/Core and Builtins/2017-09-04-12-46-25.bpo-17852.OxAtCg.rst deleted file mode 100644 index 185664c747d..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2017-09-04-12-46-25.bpo-17852.OxAtCg.rst +++ /dev/null @@ -1,2 +0,0 @@ -Maintain a list of open buffered files, flush them before exiting the -interpreter. Based on a patch from Armin Rigo. diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c index 5db44f970d2..f0621f4d4ab 100644 --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -766,8 +766,6 @@ PyInit__io(void) !(_PyIO_empty_bytes = PyBytes_FromStringAndSize(NULL, 0))) goto fail; - _Py_PyAtExit(_PyIO_atexit_flush); - state->initialized = 1; return m; diff --git a/Modules/_io/_iomodule.h b/Modules/_io/_iomodule.h index 1dce5dada4e..db8403774ea 100644 --- a/Modules/_io/_iomodule.h +++ b/Modules/_io/_iomodule.h @@ -183,5 +183,3 @@ extern PyObject *_PyIO_empty_str; extern PyObject *_PyIO_empty_bytes; extern PyTypeObject _PyBytesIOBuffer_Type; - -extern void _PyIO_atexit_flush(void); diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index 50c87c1746d..189b1cd8442 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -196,7 +196,7 @@ bufferediobase_write(PyObject *self, PyObject *args) } -typedef struct _buffered { +typedef struct { PyObject_HEAD PyObject *raw; @@ -240,18 +240,8 @@ typedef struct _buffered { PyObject *dict; PyObject *weakreflist; - - /* a doubly-linked chained list of "buffered" objects that need to - be flushed when the process exits */ - struct _buffered *next, *prev; } buffered; -/* the actual list of buffered objects */ -static buffered buffer_list_end = { - .next = &buffer_list_end, - .prev = &buffer_list_end -}; - /* Implementation notes: @@ -396,15 +386,6 @@ _enter_buffered_busy(buffered *self) (self->buffer_size * (size / self->buffer_size))) -static void -remove_from_linked_list(buffered *self) -{ - self->next->prev = self->prev; - self->prev->next = self->next; - self->prev = NULL; - self->next = NULL; -} - static void buffered_dealloc(buffered *self) { @@ -413,8 +394,6 @@ buffered_dealloc(buffered *self) return; _PyObject_GC_UNTRACK(self); self->ok = 0; - if (self->next != NULL) - remove_from_linked_list(self); if (self->weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *)self); Py_CLEAR(self->raw); @@ -1838,33 +1817,10 @@ _io_BufferedWriter___init___impl(buffered *self, PyObject *raw, self->fast_closed_checks = (Py_TYPE(self) == &PyBufferedWriter_Type && Py_TYPE(raw) == &PyFileIO_Type); - if (self->next == NULL) { - self->prev = &buffer_list_end; - self->next = buffer_list_end.next; - buffer_list_end.next->prev = self; - buffer_list_end.next = self; - } - self->ok = 1; return 0; } -/* -* 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. -*/ -void _PyIO_atexit_flush(void) -{ - while (buffer_list_end.next != &buffer_list_end) { - buffered *buf = buffer_list_end.next; - remove_from_linked_list(buf); - buffered_flush(buf, NULL); - PyErr_Clear(); - } -} - static Py_ssize_t _bufferedwriter_raw_write(buffered *self, char *start, Py_ssize_t len) {