[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