bug [ 728515 ] mmap's resize method resizes the file in win32 but not unix

This commit is contained in:
Georg Brandl 2005-08-24 07:17:40 +00:00
parent 76fb6d84d0
commit 38387b8b91
4 changed files with 23 additions and 1 deletions

View File

@ -132,6 +132,7 @@ Memory-mapped file objects support the following methods:
\end{methoddesc}
\begin{methoddesc}{resize}{\var{newsize}}
Resizes the map and the underlying file, if any.
If the mmap was created with \constant{ACCESS_READ} or
\constant{ACCESS_COPY}, resizing the map will throw a \exception{TypeError} exception.
\end{methoddesc}

View File

@ -120,6 +120,14 @@ def test_both():
else:
verify(0, 'Could seek beyond the new size')
# Check that the underlying file is truncated too
# (bug #728515)
f = open(TESTFN)
f.seek(0, 2)
verify(f.tell() == 512, 'Underlying file not truncated')
f.close()
verify(m.size() == 512, 'New size not reflected in file')
m.close()
finally:

View File

@ -128,6 +128,9 @@ Core and builtins
Extension Modules
-----------------
- Bug #728515: mmap.resize() now resizes the file on Unix as it did
on Windows.
- Patch #1180695: Add nanosecond stat resolution, and st_gen,
st_birthtime for FreeBSD.

View File

@ -421,6 +421,11 @@ mmap_resize_method(mmap_object *self,
return NULL;
#else
} else {
if (ftruncate(self->fd, new_size) == -1) {
PyErr_SetFromErrno(mmap_module_error);
return NULL;
}
void *newmap;
#ifdef MREMAP_MAYMOVE
@ -910,7 +915,12 @@ new_mmap_object(PyObject *self, PyObject *args, PyObject *kwdict)
if (m_obj == NULL) {return NULL;}
m_obj->size = (size_t) map_size;
m_obj->pos = (size_t) 0;
m_obj->fd = fd;
m_obj->fd = dup(fd);
if (m_obj->fd == -1) {
Py_DECREF(m_obj);
PyErr_SetFromErrno(mmap_module_error);
return NULL;
}
m_obj->data = mmap(NULL, map_size,
prot, flags,
fd, 0);