diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2011-05-01 23:05:37 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2011-05-01 23:05:37 (GMT) |
commit | a6cd0cf0f5530f1e96114927b2824f6dc61f1bbd (patch) | |
tree | ccd842682a0b4893d38d5b4e3ac44fa06a17c6ae | |
parent | 10116d40d8794825c42b2440524411cd406d1f93 (diff) | |
download | cpython-a6cd0cf0f5530f1e96114927b2824f6dc61f1bbd.zip cpython-a6cd0cf0f5530f1e96114927b2824f6dc61f1bbd.tar.gz cpython-a6cd0cf0f5530f1e96114927b2824f6dc61f1bbd.tar.bz2 |
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.
-rw-r--r-- | Doc/library/mmap.rst | 4 | ||||
-rw-r--r-- | Lib/test/test_zlib.py | 2 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/mmapmodule.c | 9 |
4 files changed, 17 insertions, 1 deletions
diff --git a/Doc/library/mmap.rst b/Doc/library/mmap.rst index 5001d4f..e061088 100644 --- a/Doc/library/mmap.rst +++ b/Doc/library/mmap.rst @@ -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 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`:: import mmap diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py index 48ac40a..7593c06 100644 --- a/Lib/test/test_zlib.py +++ b/Lib/test/test_zlib.py @@ -74,7 +74,7 @@ class ChecksumBigBufferTestCase(unittest.TestCase): with open(support.TESTFN, "wb+") as f: f.seek(_4G) f.write(b"asdf") - with open(support.TESTFN, "rb") as f: + f.flush() self.mapping = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) def tearDown(self): @@ -66,6 +66,9 @@ Core and Builtins 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 strings are too long. diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index f484a7a..88da4a0 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -23,6 +23,9 @@ #ifndef MS_WINDOWS #define UNIX +# ifdef __APPLE__ +# include <fcntl.h> +# endif #endif #ifdef MS_WINDOWS @@ -1091,6 +1094,12 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict) "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 __VMS /* on OpenVMS we must ensure that all bytes are written to the file */ |