This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch] Fix for PCH on MS Vist host, committed


Hello

I have committed the following patch to fix problems with PCH on mingw32
host
running as Terminal Service on MS Vista version of Windows.

007-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


Index: config/i386/host-mingw32.c
===================================================================
--- config/i386/host-mingw32.c	(revision 126718)
+++ config/i386/host-mingw32.c	(working copy)
@@ -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 @@
 
   /* 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 @@
 			    size_t offset)
 {
   void * mmap_addr;
-  static HANDLE mmap_handle;
+  HANDLE mmap_handle;
 
-  if (size == 0)
-    return 0;
+  /* 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");


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]