summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <vinschen@redhat.com>2007-01-17 10:49:28 +0000
committerCorinna Vinschen <vinschen@redhat.com>2007-01-17 10:49:28 +0000
commit114506a791181f7b00f1d2fbf5fce3e497bc7e58 (patch)
treee78d11ca9105628374a525931725079c21334b03
parent6add43176b3be812d6c2934470b618d3cdab71f4 (diff)
downloadgdb-114506a791181f7b00f1d2fbf5fce3e497bc7e58.tar.gz
* mmap.cc (MapView9x): Note possible uselessness of retrying.
(MapViewNT): Ditto. (mmap64): Fix pre-reservation to work for non NULL, non MAP_FIXED.
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/mmap.cc31
2 files changed, 29 insertions, 8 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index ec4d0ce60b5..5f621f85a4b 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,9 @@
+2007-01-17 Corinna Vinschen <corinna@vinschen.de>
+
+ * mmap.cc (MapView9x): Note possible uselessness of retrying.
+ (MapViewNT): Ditto.
+ (mmap64): Fix pre-reservation to work for non NULL, non MAP_FIXED.
+
2007-01-15 Corinna Vinschen <corinna@vinschen.de>
* CYGWIN_LICENSE: Fix web pages and contact information.
diff --git a/winsup/cygwin/mmap.cc b/winsup/cygwin/mmap.cc
index 13eb8c92e06..8d068acd402 100644
--- a/winsup/cygwin/mmap.cc
+++ b/winsup/cygwin/mmap.cc
@@ -328,7 +328,10 @@ MapView9x (HANDLE h, void *addr, size_t len, DWORD openflags,
/* Try mapping using the given address first, even if it's NULL.
If it failed, and addr was not NULL and flags is not MAP_FIXED,
- try again with NULL address. */
+ try again with NULL address.
+
+ Note: Retrying the mapping might be unnecessary, now that mmap64 checks
+ for a valid memory area first. */
if (!addr)
base = MapViewOfFile (h, access, high, low, len);
else
@@ -357,7 +360,10 @@ MapViewNT (HANDLE h, void *addr, size_t len, DWORD openflags,
/* Try mapping using the given address first, even if it's NULL.
If it failed, and addr was not NULL and flags is not MAP_FIXED,
- try again with NULL address. */
+ try again with NULL address.
+
+ Note: Retrying the mapping might be unnecessary, now that mmap64 checks
+ for a valid memory area first. */
ret = NtMapViewOfSection (h, GetCurrentProcess (), &base, 0, commitsize,
&offset, &viewsize, ViewShare, alloc_type, protect);
if (!NT_SUCCESS (ret) && addr && !fixed (flags))
@@ -1205,18 +1211,27 @@ go_ahead:
subsequent real mappings. This ensures that we have enough space
for the whole thing. */
orig_len = roundup2 (orig_len, pagesize);
- addr = VirtualAlloc (addr, orig_len, MEM_TOP_DOWN | MEM_RESERVE,
- PAGE_READWRITE);
- if (!addr)
+ PVOID newaddr = VirtualAlloc (addr, orig_len, MEM_TOP_DOWN | MEM_RESERVE,
+ PAGE_READWRITE);
+ if (!newaddr)
{
- __seterrno ();
- goto out;
+ /* If addr is not NULL, but MAP_FIXED isn't given, allow the OS
+ to choose. */
+ if (addr && !fixed (flags))
+ newaddr = VirtualAlloc (NULL, orig_len, MEM_TOP_DOWN | MEM_RESERVE,
+ PAGE_READWRITE);
+ if (!newaddr)
+ {
+ __seterrno ();
+ goto out;
+ }
}
- if (!VirtualFree (addr, 0, MEM_RELEASE))
+ if (!VirtualFree (newaddr, 0, MEM_RELEASE))
{
__seterrno ();
goto out;
}
+ addr = newaddr;
}
base = mmap_worker (fh, (caddr_t) addr, len, prot, flags, fd, off);