diff options
-rw-r--r-- | Doc/library/mmap.rst | 10 | ||||
-rw-r--r-- | Doc/whatsnew/3.8.rst | 7 | ||||
-rw-r--r-- | Lib/test/test_mmap.py | 19 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2018-08-06-21-47-03.bpo-2122.GWdmrm.rst | 2 | ||||
-rw-r--r-- | Modules/mmapmodule.c | 11 |
5 files changed, 36 insertions, 13 deletions
diff --git a/Doc/library/mmap.rst b/Doc/library/mmap.rst index ca09a6a..c8ae7a6 100644 --- a/Doc/library/mmap.rst +++ b/Doc/library/mmap.rst @@ -191,11 +191,13 @@ To map anonymous memory, -1 should be passed as the fileno along with the length changes to the given range of bytes will be flushed to disk; otherwise, the whole extent of the mapping is flushed. - **(Windows version)** A nonzero value returned indicates success; zero - indicates failure. + ``None`` is returned to indicate success. An exception is raised when the + call failed. - **(Unix version)** A zero value is returned to indicate success. An - exception is raised when the call failed. + .. versionchanged:: 3.8 + Previously, a nonzero value was returned on success; zero was returned + on error under Windows. A zero value was returned on success; an + exception was raised on error under Unix. .. method:: move(dest, src, count) diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 1f816a1..d07896b 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -265,6 +265,13 @@ Changes in the Python API task name is visible in the ``repr()`` output of :class:`asyncio.Task` and can also be retrieved using the :meth:`~asyncio.Task.get_name` method. +* The :meth:`mmap.flush() <mmap.mmap.flush>` method now returns ``None`` on + success and raises an exception on error under all platforms. Previously, + its behavior was platform-depended: a nonzero value was returned on success; + zero was returned on error under Windows. A zero value was returned on + success; an exception was raised on error under Unix. + (Contributed by Berker Peksag in :issue:`2122`.) + CPython bytecode changes ------------------------ diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py index 355af8c..d513810 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -1,4 +1,4 @@ -from test.support import (TESTFN, run_unittest, import_module, unlink, +from test.support import (TESTFN, import_module, unlink, requires, _2G, _4G, gc_collect, cpython_only) import unittest import os @@ -741,6 +741,18 @@ class MmapTests(unittest.TestCase): with self.assertRaises(TypeError): m * 2 + def test_flush_return_value(self): + # mm.flush() should return None on success, raise an + # exception on error under all platforms. + mm = mmap.mmap(-1, 16) + self.addCleanup(mm.close) + mm.write(b'python') + result = mm.flush() + self.assertIsNone(result) + if os.name != 'nt': + # 'offset' must be a multiple of mmap.PAGESIZE. + self.assertRaises(OSError, mm.flush, 1, len(b'python')) + class LargeMmapTests(unittest.TestCase): @@ -803,8 +815,5 @@ class LargeMmapTests(unittest.TestCase): self._test_around_boundary(_4G) -def test_main(): - run_unittest(MmapTests, LargeMmapTests) - if __name__ == '__main__': - test_main() + unittest.main() diff --git a/Misc/NEWS.d/next/Library/2018-08-06-21-47-03.bpo-2122.GWdmrm.rst b/Misc/NEWS.d/next/Library/2018-08-06-21-47-03.bpo-2122.GWdmrm.rst new file mode 100644 index 0000000..dd31c0e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-08-06-21-47-03.bpo-2122.GWdmrm.rst @@ -0,0 +1,2 @@ +The :meth:`mmap.flush() <mmap.mmap.flush>` method now returns ``None`` on +success, raises an exception on error under all platforms. diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 27030db..af9cd7e 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -569,18 +569,21 @@ mmap_flush_method(mmap_object *self, PyObject *args) } if (self->access == ACCESS_READ || self->access == ACCESS_COPY) - return PyLong_FromLong(0); + Py_RETURN_NONE; #ifdef MS_WINDOWS - return PyLong_FromLong((long) FlushViewOfFile(self->data+offset, size)); + if (!FlushViewOfFile(self->data+offset, size)) { + PyErr_SetFromWindowsErr(GetLastError()); + return NULL; + } + Py_RETURN_NONE; #elif defined(UNIX) - /* XXX semantics of return value? */ /* XXX flags for msync? */ if (-1 == msync(self->data + offset, size, MS_SYNC)) { PyErr_SetFromErrno(PyExc_OSError); return NULL; } - return PyLong_FromLong(0); + Py_RETURN_NONE; #else PyErr_SetString(PyExc_ValueError, "flush not supported on this system"); return NULL; |