mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
This reverts commit e38d12ed34
.
This commit is contained in:
parent
e38d12ed34
commit
db564238db
5 changed files with 1 additions and 75 deletions
24
Lib/_pyio.py
24
Lib/_pyio.py
|
@ -1185,7 +1185,6 @@ class BufferedWriter(_BufferedIOMixin):
|
||||||
self.buffer_size = buffer_size
|
self.buffer_size = buffer_size
|
||||||
self._write_buf = bytearray()
|
self._write_buf = bytearray()
|
||||||
self._write_lock = Lock()
|
self._write_lock = Lock()
|
||||||
_register_writer(self)
|
|
||||||
|
|
||||||
def writable(self):
|
def writable(self):
|
||||||
return self.raw.writable()
|
return self.raw.writable()
|
||||||
|
@ -2575,26 +2574,3 @@ class StringIO(TextIOWrapper):
|
||||||
def detach(self):
|
def detach(self):
|
||||||
# This doesn't make sense on StringIO.
|
# This doesn't make sense on StringIO.
|
||||||
self._unsupported("detach")
|
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)
|
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
Maintain a list of open buffered files, flush them before exiting the
|
|
||||||
interpreter. Based on a patch from Armin Rigo.
|
|
|
@ -766,8 +766,6 @@ PyInit__io(void)
|
||||||
!(_PyIO_empty_bytes = PyBytes_FromStringAndSize(NULL, 0)))
|
!(_PyIO_empty_bytes = PyBytes_FromStringAndSize(NULL, 0)))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
_Py_PyAtExit(_PyIO_atexit_flush);
|
|
||||||
|
|
||||||
state->initialized = 1;
|
state->initialized = 1;
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
|
|
|
@ -183,5 +183,3 @@ extern PyObject *_PyIO_empty_str;
|
||||||
extern PyObject *_PyIO_empty_bytes;
|
extern PyObject *_PyIO_empty_bytes;
|
||||||
|
|
||||||
extern PyTypeObject _PyBytesIOBuffer_Type;
|
extern PyTypeObject _PyBytesIOBuffer_Type;
|
||||||
|
|
||||||
extern void _PyIO_atexit_flush(void);
|
|
||||||
|
|
|
@ -196,7 +196,7 @@ bufferediobase_write(PyObject *self, PyObject *args)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
typedef struct _buffered {
|
typedef struct {
|
||||||
PyObject_HEAD
|
PyObject_HEAD
|
||||||
|
|
||||||
PyObject *raw;
|
PyObject *raw;
|
||||||
|
@ -240,18 +240,8 @@ typedef struct _buffered {
|
||||||
|
|
||||||
PyObject *dict;
|
PyObject *dict;
|
||||||
PyObject *weakreflist;
|
PyObject *weakreflist;
|
||||||
|
|
||||||
/* a doubly-linked chained list of "buffered" objects that need to
|
|
||||||
be flushed when the process exits */
|
|
||||||
struct _buffered *next, *prev;
|
|
||||||
} buffered;
|
} buffered;
|
||||||
|
|
||||||
/* the actual list of buffered objects */
|
|
||||||
static buffered buffer_list_end = {
|
|
||||||
.next = &buffer_list_end,
|
|
||||||
.prev = &buffer_list_end
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Implementation notes:
|
Implementation notes:
|
||||||
|
|
||||||
|
@ -396,15 +386,6 @@ _enter_buffered_busy(buffered *self)
|
||||||
(self->buffer_size * (size / self->buffer_size)))
|
(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
|
static void
|
||||||
buffered_dealloc(buffered *self)
|
buffered_dealloc(buffered *self)
|
||||||
{
|
{
|
||||||
|
@ -413,8 +394,6 @@ buffered_dealloc(buffered *self)
|
||||||
return;
|
return;
|
||||||
_PyObject_GC_UNTRACK(self);
|
_PyObject_GC_UNTRACK(self);
|
||||||
self->ok = 0;
|
self->ok = 0;
|
||||||
if (self->next != NULL)
|
|
||||||
remove_from_linked_list(self);
|
|
||||||
if (self->weakreflist != NULL)
|
if (self->weakreflist != NULL)
|
||||||
PyObject_ClearWeakRefs((PyObject *)self);
|
PyObject_ClearWeakRefs((PyObject *)self);
|
||||||
Py_CLEAR(self->raw);
|
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 &&
|
self->fast_closed_checks = (Py_TYPE(self) == &PyBufferedWriter_Type &&
|
||||||
Py_TYPE(raw) == &PyFileIO_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;
|
self->ok = 1;
|
||||||
return 0;
|
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
|
static Py_ssize_t
|
||||||
_bufferedwriter_raw_write(buffered *self, char *start, Py_ssize_t len)
|
_bufferedwriter_raw_write(buffered *self, char *start, Py_ssize_t len)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue