Kaydet (Commit) 38387b8b authored tarafından Georg Brandl's avatar Georg Brandl

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

üst 76fb6d84
...@@ -132,6 +132,7 @@ Memory-mapped file objects support the following methods: ...@@ -132,6 +132,7 @@ Memory-mapped file objects support the following methods:
\end{methoddesc} \end{methoddesc}
\begin{methoddesc}{resize}{\var{newsize}} \begin{methoddesc}{resize}{\var{newsize}}
Resizes the map and the underlying file, if any.
If the mmap was created with \constant{ACCESS_READ} or If the mmap was created with \constant{ACCESS_READ} or
\constant{ACCESS_COPY}, resizing the map will throw a \exception{TypeError} exception. \constant{ACCESS_COPY}, resizing the map will throw a \exception{TypeError} exception.
\end{methoddesc} \end{methoddesc}
......
...@@ -120,6 +120,14 @@ def test_both(): ...@@ -120,6 +120,14 @@ def test_both():
else: else:
verify(0, 'Could seek beyond the new size') 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() m.close()
finally: finally:
......
...@@ -128,6 +128,9 @@ Core and builtins ...@@ -128,6 +128,9 @@ Core and builtins
Extension Modules 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, - Patch #1180695: Add nanosecond stat resolution, and st_gen,
st_birthtime for FreeBSD. st_birthtime for FreeBSD.
......
...@@ -421,6 +421,11 @@ mmap_resize_method(mmap_object *self, ...@@ -421,6 +421,11 @@ mmap_resize_method(mmap_object *self,
return NULL; return NULL;
#else #else
} else { } else {
if (ftruncate(self->fd, new_size) == -1) {
PyErr_SetFromErrno(mmap_module_error);
return NULL;
}
void *newmap; void *newmap;
#ifdef MREMAP_MAYMOVE #ifdef MREMAP_MAYMOVE
...@@ -910,7 +915,12 @@ new_mmap_object(PyObject *self, PyObject *args, PyObject *kwdict) ...@@ -910,7 +915,12 @@ new_mmap_object(PyObject *self, PyObject *args, PyObject *kwdict)
if (m_obj == NULL) {return NULL;} if (m_obj == NULL) {return NULL;}
m_obj->size = (size_t) map_size; m_obj->size = (size_t) map_size;
m_obj->pos = (size_t) 0; 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, m_obj->data = mmap(NULL, map_size,
prot, flags, prot, flags,
fd, 0); fd, 0);
......
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