summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/mmap.rst10
-rw-r--r--Doc/whatsnew/3.8.rst7
-rw-r--r--Lib/test/test_mmap.py19
-rw-r--r--Misc/NEWS.d/next/Library/2018-08-06-21-47-03.bpo-2122.GWdmrm.rst2
-rw-r--r--Modules/mmapmodule.c11
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;