STINNER Victor <[email protected]> added the comment:
> So in my local repro, Python is looping forever on successful write() for
> reasons I'm not immediately sure of.
io.BufferedWriter.write() (well, especially its flush() method) calls write()
until all data is written.
Extract of _bufferedwriter_flush_unlocked() code, Modules/_io/buffered.c:
while (self->write_pos < self->write_end) {
n = _bufferedwriter_raw_write(self,
self->buffer + self->write_pos,
Py_SAFE_DOWNCAST(self->write_end - self->write_pos,
Py_off_t, Py_ssize_t));
if (n == -1) {
goto error;
}
else if (n == -2) {
_set_BlockingIOError("write could not complete without blocking",
0);
goto error;
}
self->write_pos += n;
self->raw_pos = self->write_pos;
written += Py_SAFE_DOWNCAST(n, Py_off_t, Py_ssize_t);
/* Partial writes can return successfully when interrupted by a
signal (see write(2)). We must run signal handlers before
blocking another time, possibly indefinitely. */
if (PyErr_CheckSignals() < 0)
goto error;
}
You are correct: if write() returns 0, write() is called again. If write()
always returns 0, the loop never stops...
Maybe a BlockingIOError must be raised if write(buffer) returns 0 (and buffer
is not empty).
----------
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue41013>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com