* mmap.cc (mmap64): Drop MAP_NORESERVE flag for non-anonymous,

non-private mappings.
	(mmap_record::unmap_pages): Only check noreserve flag which now implies
	anonymous and private.
	(mprotect): Ditto.
	(fixup_mmaps_after_fork): Ditto.
This commit is contained in:
Corinna Vinschen 2006-07-13 10:29:21 +00:00
parent f6105f89d5
commit 2e19497afc
2 changed files with 24 additions and 3 deletions

View File

@ -1,3 +1,17 @@
2006-07-13 Corinna Vinschen <corinna@vinschen.de>
* mmap.cc (mmap64): Drop MAP_NORESERVE flag for non-anonymous,
non-private mappings.
(mmap_record::unmap_pages): Only check noreserve flag which now implies
anonymous and private.
(mprotect): Ditto.
(fixup_mmaps_after_fork): Ditto.
2006-07-13 Corinna Vinschen <corinna@vinschen.de>
* mmap.cc (mmap64): Drop MAP_RESERVED flag for all non-anonymous,
non-private mappings.
2006-07-13 Corinna Vinschen <corinna@vinschen.de> 2006-07-13 Corinna Vinschen <corinna@vinschen.de>
* exceptions.cc (_cygtls::handle_exceptions): Call new * exceptions.cc (_cygtls::handle_exceptions): Call new

View File

@ -647,7 +647,7 @@ mmap_record::unmap_pages (caddr_t addr, DWORD len)
DWORD off = addr - get_address (); DWORD off = addr - get_address ();
off /= getpagesize (); off /= getpagesize ();
len = PAGE_CNT (len); len = PAGE_CNT (len);
if (anonymous () && priv () && noreserve () if (noreserve ()
&& !VirtualFree (get_address () + off * getpagesize (), && !VirtualFree (get_address () + off * getpagesize (),
len * getpagesize (), MEM_DECOMMIT)) len * getpagesize (), MEM_DECOMMIT))
debug_printf ("VirtualFree in unmap_pages () failed, %E"); debug_printf ("VirtualFree in unmap_pages () failed, %E");
@ -1027,6 +1027,7 @@ mmap64 (void *addr, size_t len, int prot, int flags, int fd, _off64_t off)
if (fh->get_device () == FH_ZERO) if (fh->get_device () == FH_ZERO)
flags |= MAP_ANONYMOUS; flags |= MAP_ANONYMOUS;
} }
if (anonymous (flags) || fd == -1) if (anonymous (flags) || fd == -1)
{ {
fh = &fh_anonymous; fh = &fh_anonymous;
@ -1161,6 +1162,12 @@ mmap64 (void *addr, size_t len, int prot, int flags, int fd, _off64_t off)
go_ahead: go_ahead:
/* MAP_NORESERVE is only supported on private anonymous mappings.
Remove that bit from flags so that later code doesn't have to
test all bits. */
if (noreserve (flags) && (!anonymous (flags) || !priv (flags)))
flags &= ~MAP_NORESERVE;
map_list = mmapped_areas.get_list_by_fd (fd); map_list = mmapped_areas.get_list_by_fd (fd);
/* Test if an existing anonymous mapping can be recycled. */ /* Test if an existing anonymous mapping can be recycled. */
@ -1427,7 +1434,7 @@ mprotect (void *addr, size_t len, int prot)
if (rec->attached ()) if (rec->attached ())
continue; continue;
new_prot = gen_protect (prot, rec->get_flags ()); new_prot = gen_protect (prot, rec->get_flags ());
if (rec->anonymous () && rec->priv () && rec->noreserve ()) if (rec->noreserve ())
{ {
if (new_prot == PAGE_NOACCESS) if (new_prot == PAGE_NOACCESS)
ret = VirtualFree (u_addr, u_len, MEM_DECOMMIT); ret = VirtualFree (u_addr, u_len, MEM_DECOMMIT);
@ -1969,7 +1976,7 @@ fixup_mmaps_after_fork (HANDLE parent)
a strange notion how copy-on-write is supposed to work. */ a strange notion how copy-on-write is supposed to work. */
if (rec->priv ()) if (rec->priv ())
{ {
if (rec->anonymous () && rec->noreserve () if (rec->noreserve ()
&& !VirtualAlloc (address, mbi.RegionSize, && !VirtualAlloc (address, mbi.RegionSize,
MEM_COMMIT, PAGE_READWRITE)) MEM_COMMIT, PAGE_READWRITE))
{ {