aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/i386/host-mingw32.c43
2 files changed, 38 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6ef674d..e39ccd6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2007-07-19 Christoph von Wittich <Christoph_vW@reactos.org>
+ Danny Smith <dannysmith@users.sourceforge.net>
+
+ PR/other 30335
+ * config/i386/host-mingw32.c (mingw32_gt_pch_use_address): Put
+ file mapping object in local namespace if Windows version later
+ than NT4
+
2007-07-18 Richard Sandiford <richard@codesourcery.com>
* config/arm/arm-protos.h (arm_cannot_force_const_mem): Declare.
diff --git a/gcc/config/i386/host-mingw32.c b/gcc/config/i386/host-mingw32.c
index a341e27..fbd866a8 100644
--- a/gcc/config/i386/host-mingw32.c
+++ b/gcc/config/i386/host-mingw32.c
@@ -1,5 +1,5 @@
/* mingw32 host-specific hook definitions.
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2007 Free Software Foundation, Inc.
This file is part of GCC.
@@ -87,11 +87,11 @@ mingw32_gt_pch_get_address (size_t size, int fd ATTRIBUTE_UNUSED)
/* FIXME: We let system determine base by setting first arg to NULL.
Allocating at top of available address space avoids unnecessary
- fragmentation of "ordinary" (malloc's) address space but may not be safe
- with delayed load of system dll's. Preferred addresses for NT system
- dlls is in 0x70000000 to 0x78000000 range.
- If we allocate at bottom we need to reserve the address as early as possible
- and at the same point in each invocation. */
+ fragmentation of "ordinary" (malloc's) address space but may not
+ be safe with delayed load of system dll's. Preferred addresses
+ for NT system dlls is in 0x70000000 to 0x78000000 range.
+ If we allocate at bottom we need to reserve the address as early
+ as possible and at the same point in each invocation. */
res = VirtualAlloc (NULL, pch_VA_max_size,
MEM_RESERVE | MEM_TOP_DOWN,
@@ -115,19 +115,36 @@ mingw32_gt_pch_use_address (void *addr, size_t size, int fd,
size_t offset)
{
void * mmap_addr;
- static HANDLE mmap_handle;
-
- if (size == 0)
- return 0;
+ HANDLE mmap_handle;
+
+ /* Apparently, MS Vista puts unnamed file mapping objects into Global
+ namespace when running an application in a Terminal Server
+ session. This causes failure since, by default, applications
+ don't get SeCreateGlobalPrivilege. We don't need global
+ memory sharing so explicitly put object into Local namespace. */
+ const char object_name[] = "Local\\MinGWGCCPCH";
+
+ /* However, the documentation for CreateFileMapping says that on NT4
+ and earlier, backslashes are invalid in object name. So, we need
+ to check if we are on Windows2000 or higher. */
+ OSVERSIONINFO version_info;
+ if (size == 0)
+ return 0;
+
/* Offset must be also be a multiple of allocation granularity for
this to work. We can't change the offset. */
if ((offset & (va_granularity - 1)) != 0 || size > pch_VA_max_size)
return -1;
- mmap_handle = CreateFileMapping ((HANDLE) _get_osfhandle (fd),
- NULL, PAGE_WRITECOPY | SEC_COMMIT,
- 0, 0, NULL);
+ /* Determine the version of Windows we are running on. */
+ version_info.dwOSVersionInfoSize = sizeof (version_info);
+ GetVersionEx (&version_info);
+
+ mmap_handle = CreateFileMappingA ((HANDLE) _get_osfhandle (fd), NULL,
+ PAGE_WRITECOPY | SEC_COMMIT, 0, 0,
+ version_info.dwMajorVersion > 4
+ ? object_name : NULL);
if (mmap_handle == NULL)
{
w32_error (__FUNCTION__, __FILE__, __LINE__, "CreateFileMapping");