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:
\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}
......
......@@ -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:
......
......@@ -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.
......
......@@ -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);
......
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