Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit db56423

Browse files
authored
Revert "bpo-17852: Maintain a list of BufferedWriter objects. Flush them on exit. (#1908)" (#3337)
This reverts commit e38d12e.
1 parent e38d12e commit db56423

File tree

5 files changed

+1
-75
lines changed

5 files changed

+1
-75
lines changed

Lib/_pyio.py

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,7 +1185,6 @@ def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
11851185
self.buffer_size = buffer_size
11861186
self._write_buf = bytearray()
11871187
self._write_lock = Lock()
1188-
_register_writer(self)
11891188

11901189
def writable(self):
11911190
return self.raw.writable()
@@ -2575,26 +2574,3 @@ def encoding(self):
25752574
def detach(self):
25762575
# This doesn't make sense on StringIO.
25772576
self._unsupported("detach")
2578-
2579-
2580-
# ____________________________________________________________
2581-
2582-
import atexit, weakref
2583-
2584-
_all_writers = weakref.WeakSet()
2585-
2586-
def _register_writer(w):
2587-
# keep weak-ref to buffered writer
2588-
_all_writers.add(w)
2589-
2590-
def _flush_all_writers():
2591-
# Ensure all buffered writers are flushed before proceeding with
2592-
# normal shutdown. Otherwise, if the underlying file objects get
2593-
# finalized before the buffered writer wrapping it then any buffered
2594-
# data will be lost.
2595-
for w in _all_writers:
2596-
try:
2597-
w.flush()
2598-
except:
2599-
pass
2600-
atexit.register(_flush_all_writers)

Misc/NEWS.d/next/Core and Builtins/2017-09-04-12-46-25.bpo-17852.OxAtCg.rst

Lines changed: 0 additions & 2 deletions
This file was deleted.

Modules/_io/_iomodule.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -766,8 +766,6 @@ PyInit__io(void)
766766
!(_PyIO_empty_bytes = PyBytes_FromStringAndSize(NULL, 0)))
767767
goto fail;
768768

769-
_Py_PyAtExit(_PyIO_atexit_flush);
770-
771769
state->initialized = 1;
772770

773771
return m;

Modules/_io/_iomodule.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,5 +183,3 @@ extern PyObject *_PyIO_empty_str;
183183
extern PyObject *_PyIO_empty_bytes;
184184

185185
extern PyTypeObject _PyBytesIOBuffer_Type;
186-
187-
extern void _PyIO_atexit_flush(void);

Modules/_io/bufferedio.c

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ bufferediobase_write(PyObject *self, PyObject *args)
196196
}
197197

198198

199-
typedef struct _buffered {
199+
typedef struct {
200200
PyObject_HEAD
201201

202202
PyObject *raw;
@@ -240,18 +240,8 @@ typedef struct _buffered {
240240

241241
PyObject *dict;
242242
PyObject *weakreflist;
243-
244-
/* a doubly-linked chained list of "buffered" objects that need to
245-
be flushed when the process exits */
246-
struct _buffered *next, *prev;
247243
} buffered;
248244

249-
/* the actual list of buffered objects */
250-
static buffered buffer_list_end = {
251-
.next = &buffer_list_end,
252-
.prev = &buffer_list_end
253-
};
254-
255245
/*
256246
Implementation notes:
257247
@@ -396,15 +386,6 @@ _enter_buffered_busy(buffered *self)
396386
(self->buffer_size * (size / self->buffer_size)))
397387

398388

399-
static void
400-
remove_from_linked_list(buffered *self)
401-
{
402-
self->next->prev = self->prev;
403-
self->prev->next = self->next;
404-
self->prev = NULL;
405-
self->next = NULL;
406-
}
407-
408389
static void
409390
buffered_dealloc(buffered *self)
410391
{
@@ -413,8 +394,6 @@ buffered_dealloc(buffered *self)
413394
return;
414395
_PyObject_GC_UNTRACK(self);
415396
self->ok = 0;
416-
if (self->next != NULL)
417-
remove_from_linked_list(self);
418397
if (self->weakreflist != NULL)
419398
PyObject_ClearWeakRefs((PyObject *)self);
420399
Py_CLEAR(self->raw);
@@ -1838,33 +1817,10 @@ _io_BufferedWriter___init___impl(buffered *self, PyObject *raw,
18381817
self->fast_closed_checks = (Py_TYPE(self) == &PyBufferedWriter_Type &&
18391818
Py_TYPE(raw) == &PyFileIO_Type);
18401819

1841-
if (self->next == NULL) {
1842-
self->prev = &buffer_list_end;
1843-
self->next = buffer_list_end.next;
1844-
buffer_list_end.next->prev = self;
1845-
buffer_list_end.next = self;
1846-
}
1847-
18481820
self->ok = 1;
18491821
return 0;
18501822
}
18511823

1852-
/*
1853-
* Ensure all buffered writers are flushed before proceeding with
1854-
* normal shutdown. Otherwise, if the underlying file objects get
1855-
* finalized before the buffered writer wrapping it then any buffered
1856-
* data will be lost.
1857-
*/
1858-
void _PyIO_atexit_flush(void)
1859-
{
1860-
while (buffer_list_end.next != &buffer_list_end) {
1861-
buffered *buf = buffer_list_end.next;
1862-
remove_from_linked_list(buf);
1863-
buffered_flush(buf, NULL);
1864-
PyErr_Clear();
1865-
}
1866-
}
1867-
18681824
static Py_ssize_t
18691825
_bufferedwriter_raw_write(buffered *self, char *start, Py_ssize_t len)
18701826
{

0 commit comments

Comments
 (0)