]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-138092: Allow calling mmap.flush with offset only (#138093)
authorAN Long <aisk@users.noreply.github.com>
Tue, 30 Sep 2025 09:08:50 +0000 (18:08 +0900)
committerGitHub <noreply@github.com>
Tue, 30 Sep 2025 09:08:50 +0000 (11:08 +0200)
Doc/library/mmap.rst
Lib/test/test_mmap.py
Misc/NEWS.d/next/Library/2025-08-24-02-04-32.gh-issue-138092.V4-wTO.rst [new file with mode: 0644]
Modules/mmapmodule.c

index bd3f7229bdaf70c65d33775a548f58a57a73d058..b6ffb5cebc020eb34cc0506dbd0931eb18024d78 100644 (file)
@@ -212,8 +212,7 @@ To map anonymous memory, -1 should be passed as the fileno along with the length
          Writable :term:`bytes-like object` is now accepted.
 
 
-   .. method:: flush()
-               flush(offset, size, /)
+   .. method:: flush([offset[, size]])
 
       Flushes changes made to the in-memory copy of a file back to disk. Without
       use of this call there is no guarantee that changes are written back before
@@ -230,6 +229,12 @@ To map anonymous memory, -1 should be passed as the fileno along with the length
          on error under Windows.  A zero value was returned on success; an
          exception was raised on error under Unix.
 
+      .. versionchanged:: next
+         Allow specifying *offset* without *size*. Previously, both *offset*
+         and *size* parameters were required together. Now *offset* can be
+         specified alone, and the flush operation will extend from *offset*
+         to the end of the mmap.
+
 
    .. method:: madvise(option[, start[, length]])
 
index 75ea1a671b67de124fd9a87667afe4090b3ad419..0571eed23f72dcac6bfab1a76da184cf27b4bf53 100644 (file)
@@ -1145,6 +1145,18 @@ class MmapTests(unittest.TestCase):
         self.assertEqual(stdout.strip(), b'')
         self.assertEqual(stderr.strip(), b'')
 
+    def test_flush_parameters(self):
+        with open(TESTFN, 'wb+') as f:
+            f.write(b'x' * PAGESIZE * 3)
+            f.flush()
+
+            m = mmap.mmap(f.fileno(), PAGESIZE * 3)
+            self.addCleanup(m.close)
+
+            m.flush()
+            m.flush(PAGESIZE)
+            m.flush(PAGESIZE, PAGESIZE)
+
 
 class LargeMmapTests(unittest.TestCase):
 
diff --git a/Misc/NEWS.d/next/Library/2025-08-24-02-04-32.gh-issue-138092.V4-wTO.rst b/Misc/NEWS.d/next/Library/2025-08-24-02-04-32.gh-issue-138092.V4-wTO.rst
new file mode 100644 (file)
index 0000000..21c28c4
--- /dev/null
@@ -0,0 +1,2 @@
+Fixed a bug in :meth:`mmap.mmap.flush` where calling with only an offset
+parameter would fail.
index 8caadde8ae211bfbca26c8942d25b4bb50a86540..41d117162882d73d7a9e4d700d431fe0e1d01e41 100644 (file)
@@ -933,11 +933,15 @@ static PyObject *
 mmap_flush_method(PyObject *op, PyObject *args)
 {
     Py_ssize_t offset = 0;
+    Py_ssize_t size = -1;
     mmap_object *self = mmap_object_CAST(op);
-    Py_ssize_t size = self->size;
     CHECK_VALID(NULL);
-    if (!PyArg_ParseTuple(args, "|nn:flush", &offset, &size))
+    if (!PyArg_ParseTuple(args, "|nn:flush", &offset, &size)) {
         return NULL;
+    }
+    if (size == -1) {
+        size = self->size - offset;
+    }
     if (size < 0 || offset < 0 || self->size - offset < size) {
         PyErr_SetString(PyExc_ValueError, "flush values out of range");
         return NULL;