[Python-checkins] r68066 - sandbox/trunk/io-c/_bufferedio.c
antoine.pitrou
python-checkins at python.org
Tue Dec 30 16:22:25 CET 2008
Author: antoine.pitrou
Date: Tue Dec 30 16:22:25 2008
New Revision: 68066
Log:
fix a few bugs in BufferedWriter
Modified:
sandbox/trunk/io-c/_bufferedio.c
Modified: sandbox/trunk/io-c/_bufferedio.c
==============================================================================
--- sandbox/trunk/io-c/_bufferedio.c (original)
+++ sandbox/trunk/io-c/_bufferedio.c Tue Dec 30 16:22:25 2008
@@ -879,6 +879,8 @@
self->raw = raw;
self->buffer_size = buffer_size;
+ if (_BufferedIOMixin_init(self) < 0)
+ return -1;
if (self->write_buf)
PyMem_Free(self->write_buf);
@@ -887,8 +889,6 @@
PyErr_NoMemory();
return -1;
}
- if (_BufferedIOMixin_init(self) < 0)
- return -1;
if (_BufferedWriter_reset_buf(self) < 0)
return -1;
@@ -957,9 +957,9 @@
Py_ssize_t *w = _Buffered_check_blocking_error();
if (w == NULL)
goto error;
- *w += written;
- self->write_pos += n;
- written += n;
+ self->write_pos += *w;
+ written += *w;
+ *w = written;
/* Already re-raised */
goto error;
}
@@ -995,7 +995,9 @@
return NULL;
}
- /* Fast path: the data to write can be fully buffered */
+ ENTER_BUFFERED_WRITER(self)
+
+ /* Fast path: the data to write can be fully buffered. */
avail = self->buffer_size - self->write_end;
if (buf.len <= avail) {
memcpy(self->write_buf + self->write_end, buf.buf, buf.len);
@@ -1004,8 +1006,6 @@
goto end;
}
- ENTER_BUFFERED_WRITER(self)
-
/* First write the current buffer */
res = _BufferedWriter_flush_unlocked(self);
if (res == NULL) {
@@ -1022,13 +1022,13 @@
/* Everything can be buffered */
PyErr_Clear();
memcpy(self->write_buf + self->write_end, buf.buf, buf.len);
- self->write_pos += buf.len;
+ self->write_end += buf.len;
written = buf.len;
goto end;
}
/* Buffer as much as possible. */
memcpy(self->write_buf + self->write_end, buf.buf, avail);
- self->write_pos += avail;
+ self->write_end += avail;
/* Already re-raised */
*w = avail;
res = NULL;
@@ -1050,9 +1050,9 @@
remaining -= *w;
if (remaining > self->buffer_size) {
/* Can't buffer everything, still buffer as much as possible */
- memcpy(self->write_buf, buf.buf + written, remaining);
+ memcpy(self->write_buf, buf.buf + written, self->buffer_size);
self->write_end = self->buffer_size;
- *w += self->buffer_size;
+ *w = written + self->buffer_size;
/* Already re-raised */
goto error;
}
More information about the Python-checkins
mailing list