| delorie.com/archives/browse.cgi | search | 
| X-Recipient: | archive-cygwin AT delorie DOT com | 
| DomainKey-Signature: | a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id | 
| :list-unsubscribe:list-subscribe:list-archive:list-post | |
| :list-help:sender:subject:to:references:from:message-id:date | |
| :mime-version:in-reply-to:content-type | |
| :content-transfer-encoding; q=dns; s=default; b=Se5DQttFlrzYATnP | |
| 47PHYsjlQ3NWOJatdAs/pfz3UDbHl2e/ZlEVxlCienMIqNSw7tfXfkyqdmzKO37D | |
| BG2llZEMpmjLFOw8YnySAx5l9BCw/JPlk//cA1rtchRNLD87HBPkARftKXI98Byh | |
| 2tSYHQpanxOaN6UT91NhgqgFM+0= | |
| DKIM-Signature: | v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id | 
| :list-unsubscribe:list-subscribe:list-archive:list-post | |
| :list-help:sender:subject:to:references:from:message-id:date | |
| :mime-version:in-reply-to:content-type | |
| :content-transfer-encoding; s=default; bh=L0TfciiEHxhoF3EO6SKsSO | |
| SXRSY=; b=Xgnp7jhI7Rfv1BOJU9Go9/gyMGM/VuGqmnoGSIuhyOuvJHtZG1fuYB | |
| sf77XURCAZrXQ+YiVQ15IEsHDLT0kzKykl0CYIFJPa2BY0ytoQL+RnXT3OXNO5E4 | |
| 5Af0Jqbspn6MSTZKux78tqI94dS0mHjdodfkCmB72gvpq/U7C70NA= | |
| Mailing-List: | contact cygwin-help AT cygwin DOT com; run by ezmlm | 
| List-Id: | <cygwin.cygwin.com> | 
| List-Subscribe: | <mailto:cygwin-subscribe AT cygwin DOT com> | 
| List-Archive: | <http://sourceware.org/ml/cygwin/> | 
| List-Post: | <mailto:cygwin AT cygwin DOT com> | 
| List-Help: | <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs> | 
| Sender: | cygwin-owner AT cygwin DOT com | 
| Mail-Followup-To: | cygwin AT cygwin DOT com | 
| Delivered-To: | mailing list cygwin AT cygwin DOT com | 
| Authentication-Results: | sourceware.org; auth=none | 
| X-Virus-Found: | No | 
| X-Spam-SWARE-Status: | No, score=-2.3 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy= | 
| X-HELO: | limerock03.mail.cornell.edu | 
| X-CornellRouted: | This message has been Routed already. | 
| Subject: | Re: Atomic mmap replacement | 
| To: | cygwin AT cygwin DOT com | 
| References: | <66bf4f86-4618-b9a3-3e33-2c240b9204d0 AT cornell DOT edu> <20180219090042 DOT GC3417 AT calimero DOT vinschen DOT de> | 
| From: | Ken Brown <kbrown AT cornell DOT edu> | 
| Message-ID: | <bf821c51-5cea-a3b9-3b24-812cdb8a7b9c@cornell.edu> | 
| Date: | Mon, 19 Feb 2018 08:22:38 -0500 | 
| User-Agent: | Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 | 
| MIME-Version: | 1.0 | 
| In-Reply-To: | <20180219090042.GC3417@calimero.vinschen.de> | 
| X-PMX-Cornell-Gauge: | Gauge=XXXXX | 
| X-PMX-CORNELL-AUTH-RESULTS: | dkim-out=none; | 
| X-IsSubscribed: | yes | 
On 2/19/2018 4:00 AM, Corinna Vinschen wrote:
> On Feb 17 22:37, Ken Brown wrote:
>> 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?
> 
> Several limitations in the Windows kernel disallow this:
> 
> - It doesn't allow to unmap parts of a map, only the entire map as a
>    whole.
>    
>    Cygwin has a workaround: If you unmap parts of a map it just keeps
>    track of this and sets the protection of the affected pages to
>    PAGE_NOACCESS.  In case of anonymous mappings, it even recycles them
>    potentially for other mappings.
> 
> - It also disallows to re-map any allocated or mapped mamory for another
>    purpose.
> 
> So this part of the POSIX specs for mmap:
> 
>    "The mapping established by mmap() shall replace any previous mappings
>     for those whole pages containing any part of the address space of the
>     process starting at pa and continuing for len bytes"
> 
> can't be implemented with Windows means.
> 
> The only workaround possible would be to handle this *exact* scenario as
> a special case in Cygwin's mmap:  If the new mapping falls in the middle
> of an existing mapping and if the original mapping was an anonymous
> mapping with PROT_NONE page protection, then
> 
> - unmap the old mapping
> - remap the unaffected parts as separate anonymous mapping
> - map the affected parts for the requested file mapping
> 
> This is pretty complicated and I'm not hot on implementing it.  If it's
> really required we can take a look of course.
Thanks, Corinna.  I'll take this information back to the emacs list.
Ken
--
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
| webmaster | delorie software privacy | 
| Copyright © 2019 by DJ Delorie | Updated Jul 2019 |