Commit a6cd0cf0 authored by Victor Stinner's avatar Victor Stinner

Issue #11277: mmap calls fcntl(fd, F_FULLFSYNC) on Mac OS X to get around a

mmap bug with sparse files. Patch written by Steffen Daode Nurpmeso.
parent 10116d40
...@@ -86,6 +86,10 @@ To map anonymous memory, -1 should be passed as the fileno along with the length ...@@ -86,6 +86,10 @@ To map anonymous memory, -1 should be passed as the fileno along with the length
defaults to 0. *offset* must be a multiple of the PAGESIZE or defaults to 0. *offset* must be a multiple of the PAGESIZE or
ALLOCATIONGRANULARITY. ALLOCATIONGRANULARITY.
To ensure validity of the created memory mapping the file specified
by the descriptor *fileno* is internally automatically synchronized
with physical backing store on Mac OS X and OpenVMS.
This example shows a simple way of using :class:`mmap`:: This example shows a simple way of using :class:`mmap`::
import mmap import mmap
......
...@@ -74,7 +74,7 @@ class ChecksumBigBufferTestCase(unittest.TestCase): ...@@ -74,7 +74,7 @@ class ChecksumBigBufferTestCase(unittest.TestCase):
with open(support.TESTFN, "wb+") as f: with open(support.TESTFN, "wb+") as f:
f.seek(_4G) f.seek(_4G)
f.write(b"asdf") f.write(b"asdf")
with open(support.TESTFN, "rb") as f: f.flush()
self.mapping = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) self.mapping = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
def tearDown(self): def tearDown(self):
......
...@@ -66,6 +66,9 @@ Core and Builtins ...@@ -66,6 +66,9 @@ Core and Builtins
Library Library
------- -------
- Issue #11277: mmap.mmap() calls fcntl(fd, F_FULLFSYNC) on Mac OS X to get
around a mmap bug with sparse files. Patch written by Steffen Daode Nurpmeso.
- Issue #11763: don't use difflib in TestCase.assertMultiLineEqual if the - Issue #11763: don't use difflib in TestCase.assertMultiLineEqual if the
strings are too long. strings are too long.
......
...@@ -23,6 +23,9 @@ ...@@ -23,6 +23,9 @@
#ifndef MS_WINDOWS #ifndef MS_WINDOWS
#define UNIX #define UNIX
# ifdef __APPLE__
# include <fcntl.h>
# endif
#endif #endif
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
...@@ -1091,6 +1094,12 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict) ...@@ -1091,6 +1094,12 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
"mmap invalid access parameter."); "mmap invalid access parameter.");
} }
#ifdef __APPLE__
/* Issue #11277: fsync(2) is not enough on OS X - a special, OS X specific
fcntl(2) is necessary to force DISKSYNC and get around mmap(2) bug */
if (fd != -1)
(void)fcntl(fd, F_FULLFSYNC);
#endif
#ifdef HAVE_FSTAT #ifdef HAVE_FSTAT
# ifdef __VMS # ifdef __VMS
/* on OpenVMS we must ensure that all bytes are written to the file */ /* on OpenVMS we must ensure that all bytes are written to the file */
......
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