This is the mail archive of the
cygwin
mailing list for the Cygwin project.
Atomic mmap replacement
- From: Ken Brown <kbrown at cornell dot edu>
- To: cygwin <cygwin at cygwin dot com>
- Date: Sat, 17 Feb 2018 22:37:03 -0500
- Subject: Atomic mmap replacement
- Authentication-results: sourceware.org; auth=none
Some code in emacs wants to reserve a chunk of address space with a big
PROT_NONE anonymous mapping, and then carve it up into separate mappings
associated to segments of a file. This fails on Cygwin. Here's a test
case that illustrates the problem:
$ truncate -s 64k foo
$ cat mmap_test.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
const size_t page_size = 64 * 1024;
int
main ()
{
void *mem = mmap (NULL, 2 * page_size,
PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (mem == MAP_FAILED)
{
perror ("mmap");
exit (1);
}
int fd = open ("foo", O_RDONLY);
void *res = mmap (mem, page_size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_FIXED, fd, 0);
if (res == MAP_FAILED)
{
perror ("mmap");
exit (2);
}
}
$ gcc mmap_test.c
$ ./a
mmap: Invalid argument
$ echo $?
2
Is this a bug, or is it simply a limitation of Cygwin's mmap? If the
latter, is there a simple workaround?
Ken
P.S. For context, you can start reading here, but it might not make a
lot of sense:
https://lists.gnu.org/archive/html/emacs-devel/2018-02/msg00440.html
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple