If two parallel GCC compilation processes, which use different PCH files, run on Windows NT version 5 or newer (e.g. Win2K, WinXP, Vista) in the same session then a race condition occurs, which most likely leads to "Access Denied" error.
This may happen even if different toolchains are used or different projects are compiled at the same time. As it appears, the problem occurs because MinGW host hooks implementation uses a single session-wide name for memory mapping object. My suggested solution is to append current GCC process ID to that name. This makes the mapping name unique and avoids name collisions. Below is the patch for GCC 4.3.2 source. Tested on WinXP. As I've checked the current GCC trunk, it has the same issue. --- gcc/config/i386/host-mingw32.c 2007-08-02 13:49:31.000000000 +0300 +++ gcc/config/i386/host-mingw32.c 2009-03-17 21:00:21.422434682 +0200 @@ -120,8 +120,19 @@ 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"; + memory sharing so explicitly put object into Local namespace. + + There is also another issue, which appears if multiple concurrent + GCC processes use PCH functionality. MapViewOfFileEx returns + "Access Denied" error. So we need to make the session-wide mapping + name unique. Let's use current process ID for that. */ + const char object_name_prefix[] = "Local\\MinGWGCCPCH-"; + + /* Alloc enough space for name prefix and max possible DWORD decimal + representation */ + char object_name[sizeof( object_name_prefix ) + 10]; + snprintf (object_name, sizeof(object_name), "%s%lu", object_name_prefix, + GetCurrentProcessId()); /* However, the documentation for CreateFileMapping says that on NT4 and earlier, backslashes are invalid in object name. So, we need -- Summary: Parallel compilation fail using PCH on Windows NT>= 5.0 Product: gcc Version: 4.3.2 Status: UNCONFIRMED Severity: major Priority: P3 Component: pch AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: agalkin at hypercom dot com GCC build triplet: any GCC host triplet: i686-pc-mingw32 GCC target triplet: any http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39492