Kaydet (Commit) 57233cb3 authored tarafından Guido van Rossum's avatar Guido van Rossum

Patch 1330 by Christian Heimes (with some TLC applied by myself).

Move most of the messiness with truncate() on Windows into _fileio.c.
Still keep the flush() call in io.py though.
üst 61ec0d32
......@@ -597,24 +597,14 @@ class _BufferedIOMixin(BufferedIOBase):
return self.raw.tell()
def truncate(self, pos=None):
# On Windows, the truncate operation changes the current position
# to the end of the file, which may leave us with desynchronized
# buffers.
# Since we promise that truncate() won't change the current position,
# the easiest thing is to capture current pos now and seek back to
# it at the end.
initialpos = self.tell()
if pos is None:
pos = initialpos
# Flush the stream. We're mixing buffered I/O with lower-level I/O,
# and a flush may be necessary to synch both views of the current
# file state.
self.flush()
newpos = self.raw.truncate(pos)
self.seek(initialpos)
return newpos
if pos is None:
pos = self.tell()
return self.raw.truncate(pos)
### Flush and close ###
......
......@@ -628,14 +628,21 @@ fileio_truncate(PyFileIOObject *self, PyObject *args)
so don't even try using it. */
{
HANDLE hFile;
PyObject *pos2;
PyObject *pos2, *oldposobj;
/* store the current position */
oldposobj = portable_lseek(self->fd, NULL, 1);
if (oldposobj == NULL) {
Py_DECREF(posobj);
return NULL;
}
/* Have to move current pos to desired endpoint on Windows. */
errno = 0;
pos2 = portable_lseek(fd, posobj, SEEK_SET);
if (pos2 == NULL)
{
if (pos2 == NULL) {
Py_DECREF(posobj);
Py_DECREF(oldposobj);
return NULL;
}
Py_DECREF(pos2);
......@@ -651,6 +658,18 @@ fileio_truncate(PyFileIOObject *self, PyObject *args)
errno = EACCES;
}
Py_END_ALLOW_THREADS
if (ret == 0) {
/* Move to the previous position in the file */
pos2 = portable_lseek(fd, oldposobj, SEEK_SET);
if (pos2 == NULL) {
Py_DECREF(posobj);
Py_DECREF(oldposobj);
return NULL;
}
}
Py_DECREF(pos2);
Py_DECREF(oldposobj);
}
#else
Py_BEGIN_ALLOW_THREADS
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment