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: List-Subscribe: List-Archive: List-Post: List-Help: , 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 Message-ID: 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> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit 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 >> #include >> #include >> #include >> >> 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