Skip to content

Commit 317def9

Browse files
pitrouvstinner
authored andcommitted
bpo-17852: Revert incorrect fix based on misunderstanding of _Py_PyAtExit() semantics (#4826)
1 parent d233796 commit 317def9

File tree

5 files changed

+2
-78
lines changed

5 files changed

+2
-78
lines changed

Lib/_pyio.py

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,7 +1182,6 @@ def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
11821182
self.buffer_size = buffer_size
11831183
self._write_buf = bytearray()
11841184
self._write_lock = Lock()
1185-
_register_writer(self)
11861185

11871186
def writable(self):
11881187
return self.raw.writable()
@@ -2587,26 +2586,3 @@ def encoding(self):
25872586
def detach(self):
25882587
# This doesn't make sense on StringIO.
25892588
self._unsupported("detach")
2590-
2591-
2592-
# ____________________________________________________________
2593-
2594-
import atexit, weakref
2595-
2596-
_all_writers = weakref.WeakSet()
2597-
2598-
def _register_writer(w):
2599-
# keep weak-ref to buffered writer
2600-
_all_writers.add(w)
2601-
2602-
def _flush_all_writers():
2603-
# Ensure all buffered writers are flushed before proceeding with
2604-
# normal shutdown. Otherwise, if the underlying file objects get
2605-
# finalized before the buffered writer wrapping it then any buffered
2606-
# data will be lost.
2607-
for w in _all_writers:
2608-
try:
2609-
w.flush()
2610-
except:
2611-
pass
2612-
atexit.register(_flush_all_writers)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Revert incorrect fix based on misunderstanding of _Py_PyAtExit() semantics.

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 & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ bufferediobase_write(PyObject *self, PyObject *args)
197197
}
198198

199199

200-
typedef struct _buffered {
200+
typedef struct {
201201
PyObject_HEAD
202202

203203
PyObject *raw;
@@ -239,18 +239,8 @@ typedef struct _buffered {
239239

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

248-
/* the actual list of buffered objects */
249-
static buffered buffer_list_end = {
250-
.next = &buffer_list_end,
251-
.prev = &buffer_list_end
252-
};
253-
254244
/*
255245
Implementation notes:
256246
@@ -389,21 +379,10 @@ _enter_buffered_busy(buffered *self)
389379
(self->buffer_size * (size / self->buffer_size)))
390380

391381

392-
static void
393-
remove_from_linked_list(buffered *self)
394-
{
395-
self->next->prev = self->prev;
396-
self->prev->next = self->next;
397-
self->prev = NULL;
398-
self->next = NULL;
399-
}
400-
401382
static void
402383
buffered_dealloc(buffered *self)
403384
{
404385
self->finalizing = 1;
405-
if (self->next != NULL)
406-
remove_from_linked_list(self);
407386
if (_PyIOBase_finalize((PyObject *) self) < 0)
408387
return;
409388
_PyObject_GC_UNTRACK(self);
@@ -1827,38 +1806,10 @@ _io_BufferedWriter___init___impl(buffered *self, PyObject *raw,
18271806
self->fast_closed_checks = (Py_TYPE(self) == &PyBufferedWriter_Type &&
18281807
Py_TYPE(raw) == &PyFileIO_Type);
18291808

1830-
if (self->next == NULL) {
1831-
self->prev = &buffer_list_end;
1832-
self->next = buffer_list_end.next;
1833-
buffer_list_end.next->prev = self;
1834-
buffer_list_end.next = self;
1835-
}
1836-
18371809
self->ok = 1;
18381810
return 0;
18391811
}
18401812

1841-
/*
1842-
* Ensure all buffered writers are flushed before proceeding with
1843-
* normal shutdown. Otherwise, if the underlying file objects get
1844-
* finalized before the buffered writer wrapping it then any buffered
1845-
* data will be lost.
1846-
*/
1847-
void _PyIO_atexit_flush(void)
1848-
{
1849-
while (buffer_list_end.next != &buffer_list_end) {
1850-
buffered *buf = buffer_list_end.next;
1851-
remove_from_linked_list(buf);
1852-
if (buf->ok && !buf->finalizing) {
1853-
/* good state and not finalizing */
1854-
Py_INCREF(buf);
1855-
buffered_flush(buf, NULL);
1856-
Py_DECREF(buf);
1857-
PyErr_Clear();
1858-
}
1859-
}
1860-
}
1861-
18621813
static Py_ssize_t
18631814
_bufferedwriter_raw_write(buffered *self, char *start, Py_ssize_t len)
18641815
{

0 commit comments

Comments
 (0)